3

イベント フィルタがインストールされた QMainWindow があります。QDialog を開いて閉じた後、QMainWindow は KeyPress イベントではなく ShortcutOverride イベントのみを受け取るため、キーボードの矢印キーが反応しません。

ShortcutOverride イベントを処理するように QMainWindow のイベント フィルタを変更すると、私のプログラムでは各キー プレス イベントの前に 2 つのショートカット オーバーライド イベントがあるため、奇妙な動作が発生しました (なぜ??)。

これは機能しません - イベントは複数回処理されます:

bool eventFilter(QObject *, QEvent *event) {
  if(type == QEvent::KeyPress || type == QEvent::ShortcutOverride) {
    QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);

    switch(keyEvent->key()) {
    case Qt::Key_Up:
    case Qt::Key_Down:
    case Qt::Key_Left:
    case Qt::Key_Right:
      // Do something here
      break;
    default:
      break;
    }

    return true;
  }

  return false;
}

なぜこうなった?これらの ShortcutOverride イベントはどこから来るのですか?

編集:

結局のところ、QDialog が開かれると QMainwindow はフォーカスを失い、QDialog が閉じられると元に戻りません。QMainwindow の eventFilter で setFocus() を使用しましたが、うまくいくようです。

4

2 に答える 2

2

ダイアログが開いた後にキーボードイベントを取得できないのは、まさにフォーカスの喪失が原因です。あなたが提案した解決策は、おそらくこの問題の最良の修正です。

ShortcutOverride イベントに関しては、任意のキーまたはキーの組み合わせをショートカットとして登録できるため、キーを押すたびにイベントが発生します。このイベントは、必要に応じてショートカット処理をキャンセルするオプションを提供します。押されたキーがショートカットとして使用されるかどうかをエンジンがまだ認識していない、可能な限り早い時点で処理する必要があります。したがって、イベントは「念のため」すべてのキー押下に対して生成されます。ここで詳細を読むことができます: https://wiki.qt.io/ShortcutOverride

于 2016-02-17T21:13:11.550 に答える
0

これは、子のキーが押されたときに発生します。ショートカットキーの処理(QKeyEvent)をオーバーライドするために使用されます。

http://qt-project.org/doc/qt-4.8/qevent.html#Type-enumを参照してください

于 2012-05-03T10:59:52.353 に答える