から派生したいくつかのカスタムボタンは、autoExclusive
とcheckable
プロパティの真の魔法使いが同じ親に適用されます(ただ1つのアイテムしか同時にチェックすることができません)。QAbstractButtonがキーボードナビゲーションを使用しているときにすべての信号を放射するのはなぜですか?
親がQDialog
であり、ユーザーが簡単にキーボードから項目間を移動しかしユーザーがマウスのリリースで項目を選択した場合にのみ、いくつかの機能を起動することができますので、ダイアログは、例えば項目1のgetキーボードフォーカスのために表示されるたびに私はしたいです。
iが(この場合項目2)キーボードナビゲーションの信号をキャッチすると、すべてのQAbstractButton
信号:
clicked
pressed
released
toggled
であろうトリガーされた。
これはどうしてですか?
私は何ができますか?
Item
とDialog
実装:
Item::Item(QWidget *parent) : QAbstractButton(parent) {
setAutoExclusive(true);
setCheckable(true);
}
void Item::paintEvent(QPaintEvent *) {
QPainter p(this);
p.setPen(Qt::NoPen);
p.setRenderHint(QPainter::Antialiasing);
p.setBrush(/*brush*/);
p.drawRoundedRect(rect(), /* raduis*/, /* radius */);
p.setRenderHint(QPainter::Antialiasing, false);
if (isChecked()) p.drawPixmap(rect(), /*pixmap*/);
}
QSize Item::sizeHint() const {
return QSize(/*size*/, /*size*/);
}
Dialog::Dialog(QWidget *parent) : QDialog(parent) {
_mainLayout.setContentsMargins(24, 24, 24, 24);
_mainLayout.setSpacing(12);
_mainLayout.addWidget(&_item1, 0, 0);
_mainLayout.addWidget(&_item2, 0, 1);
_mainLayout.addWidget(&_item3, 0, 2);
QObject::connect(&_item2, SIGNAL(clicked()), this, SLOT(onItemClicked()));
QObject::connect(&_item2, SIGNAL(released()), this, SLOT(onItemReleased()));
QObject::connect(&_item2, SIGNAL(pressed()), this, SLOT(onItemPPress()));
QObject::connect(&_item2, SIGNAL(toggled(bool)), this, SLOT(onToggle(bool)));
}
void Dialog::showEvent(QShowEvent *e) {
_item1.setFocus(Qt::TabFocusReason);
QDialog::showEvent(e);
}
void Dialog::onItemClicked() {
qDebug() << "CLICKED";
}
void Dialog::onItemReleased() {
qDebug() << "RELEASED";
}
void Dialog::onItemPPress() {
qDebug() << "PRESS";
}
void Dialog::onToggle(bool f) {
qDebug() << "Toggle";
}
最初のセクションについては、シーンを作成しますが、すべてのシグナルではありません。たとえば、矢印キーを使用してボタン間を移動する場合、マウスアクションがないため、少なくともrelease()シグナルがないことが予想されます。 release()とclicked()、およびpressed()の間に違いはありません。 – IMAN4K
ああ、私は見ています - あなたは、これらのシグナルは、Tabキーまたは矢印キーフォーカスを移動する?そうであれば、それは期待される行動ではない。おそらくあなたのカスタムボタンのサブクラスに何かがあります。 –
Qtのボタンが正常に動作していないことを確認するために、$ QTDIR/examples/widgets/widgets/calculator/calculator.cppのcreateButton()メソッドにデバッグコードを追加して、電卓の例を実行し、計算機のボタンの周りにそれらの信号が放射されることはありません(マウスをクリックするかスペースバーを押しても信号が放射されます) button-> setFocusPolicy(Qt :: StrongFocus); connect(button、SIGNAL(released)、this、SLOT(printReleased())); connect(ボタン、SIGNAL(クリック)、this、SLOT(printClicked())); [...] –