6

grabKeyboard()を使用すると、フォーカスされていない場合でもウィジェットがすべてのキーボードイベントを取得できることを知っていますが、3つまたは4つのキーだけをキャプチャしたい場合はどうなりますか?

イベントフィルターを試してみました https://doc.qt.io/qt-5/qobject.html#installEventFilter

しかし、それはうまくいきませんでした(おそらく私がこのようにインストールしたためですか?)

 class MyWidget: public QGLWidget
    {
        ...
    protected:
        bool eventFilter( QObject *o, QEvent *e );
    };

    bool MyWidget::eventFilter( QObject *o, QEvent *e )
    {
        if ( e->type() == QEvent::KeyPress ) {
            // special processing for key press
            QKeyEvent *k = (QKeyEvent *)e;
            qDebug( "Ate key press %d", k->key() );
            return TRUE; // eat event
        } else {
            // standard event processing
            return FALSE;
        }
    }

// Installed it in the constructor
MyWidget::MyWidget()
{
    this->installEventFilter(this);
}

ウィジェット内のいくつかのキーをインターセプトし、残りのウィジェット(QTextEdits)を残すにはどうすればよいですか?

4

1 に答える 1

8

あなた自身のコメントはそれをすべて言います:

return TRUE; // eat event

すべてのキーを返すtrueと、イベントはそれ以上処理されません。false処理したくないすべてのキーを返す必要があります。

イベントフィルターを使用せずにkeyPressEventを再実装する別の方法:

void MyWidget::keyPressEvent( QKeyEvent* event ) {
    switch ( event->key() ) {
    case Qt::Key_X:
        //act on 'X'
        break;
    case Qt::Key_Y:
        //act on 'Y'
        break;
    default:
        event->ignore();
        break;
    }
}
于 2012-07-23T19:36:11.620 に答える