QDialogを継承するダイアログがあります。ダイアログには、Qbuttons、QLabel、QGraphicsView などを含む多くのウィジェットがあります。ボタンなどの多くのウィジェットは、フォーカスを取得したときに SPACE キーを押すイベントを処理できます。ここで、子ウィジェットのいずれにもそれを処理させたくありませんが、メイン ダイアログに処理させます。メイン ダイアログには多くのウィジェットがあるため、それらのウィジェットではなく qApp 用に EventFilter をインストールしませんでした。
コードは次のとおりです。
QApplication app(argc, 0);
MyDialog *pDlg = new MyDialog(...);
qApp->installEventFilter(pDlg);
app.exec();
メインダイアログのイベントフィルター:
bool MyDialog::eventFilter(QObject *obj, QEvent *e)
{
if(e->type() == QEvent::KeyPress)
{
QKeyEvent *ke = static_cast<QKeyEvent*>(e);
if (ke->key == Qt::Key_Space && !ke->isAutoRepeat())
{
// do my things in the main dialog
return true;
}
}
return qApp->eventFilter(watched, event);
}
残念ながら、このコードを使用した後、メイン ダイアログのレイアウトがおかしくなり、一部のウィジェットはサイズ ポリシーを覚えていないようです。Qtのサイズ変更または再描画イベントが処理されていない可能性がありますか? メインダイアログでキーイベントをキャッチする方法を教えてもらえますが、他の機能には影響しませんか?