2016-10-12 1 views
0

から派生したいくつかのカスタムボタンは、autoExclusivecheckableプロパティの真の魔法使いが同じ親に適用されます(ただ1つのアイテムしか同時にチェックすることができません)。QAbstractButtonがキーボードナビゲーションを使用しているときにすべての信号を放射するのはなぜですか?

親がQDialogであり、ユーザーが簡単にキーボードから項目間を移動しかしユーザーがマウスのリリースで項目を選択した場合にのみ、いくつかの機能を起動することができますので、ダイアログは、例えば項目1のgetキーボードフォーカスのために表示されるたびに私はしたいです。

iが(この場合項目2)キーボードナビゲーションの信号をキャッチすると、すべてのQAbstractButton信号:

clicked

pressed

released

toggled

であろうトリガーされた。

これはどうしてですか?

私は何ができますか?

ItemDialog実装:

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"; 
} 

答えて

2

は、なぜこれが起こる[信号の送信] [ん]?

通常、アプリケーションは気にするつもりはないので、 ボタンがアクティブになったか、それは活性化したことだけ。 Qtがキー押しイベントに応答してこれらの信号を出さなかった場合、誰かがキーボードで操作したときにボタンが予期した信号を発していないと永遠に不満を持ち、すべての開発者は手動でキーボードサポートを追加する必要があります期待される振る舞いを得るために、すべてのボタンに論理。

私は何ができますか?

最初に行うことは、アプリでキーボードサポートを本当に解除したいかどうかを検討することです。ほとんどの人は、キーボードを使用してボタンをアクティブにすることができると期待しています。マウスを使用できない人は(例えば、目が見えず、スクリーン・ナビゲーション・ソフトウェアを使用しているか、マウスが現在接続されていないため)キーボードのサポートを無効にすると、ダイアログを閉じることができます。

これを考慮していて、先に進めたいと思えば、ボタンサブクラスのkeyPressEvent(QKeyEvent *)をオーバーライドすることで、キーストロークをキャプチャできると思います。あなたのサブクラスの実装は、それに渡されるQKeyEventが問題のキーストロークの1つを表しているかどうかを調べることができます。もしそうであれば、keyPressEventを渡すのではなく、QKeyEventオブジェクトのaccept() ()はスーパークラスを呼び出します。

また、ボタンウィジェットでsetFocusPolicy(Qt :: NoFocus)を呼び出すだけで、フォーカスを得ることができず、キーストロークを受信できなくなる可能性があります。

+0

最初のセクションについては、シーンを作成しますが、すべてのシグナルではありません。たとえば、矢印キーを使用してボタン間を移動する場合、マウスアクションがないため、少なくともrelease()シグナルがないことが予想されます。 release()とclicked()、およびpressed()の間に違いはありません。 – IMAN4K

+0

ああ、私は見ています - あなたは、これらのシグナルは、Tabキーまたは矢印キーフォーカスを移動する?そうであれば、それは期待される行動ではない。おそらくあなたのカスタムボタンのサブクラスに何かがあります。 –

+0

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())); [...] –

関連する問題