1

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のサイズ変更または再描画イベントが処理されていない可能性がありますか? メインダイアログでキーイベントをキャッチする方法を教えてもらえますが、他の機能には影響しませんか?

4

1 に答える 1

0

基本的に、Qt でダイアログ ベースのアプリを開発する場合、メイン クラスで keypressevent を定義すると、デフォルトでキープレス イベントがメイン ダイアログ クラスによってキャプチャされます。

EDITpostevent()この目的のために使用します

子ウィジェットでキープレスイベントを行います

void childwdgt::keyPressEvent(QKeyEvent *e)
{
if (e->type() == QEvent::KeyPress)
{
    {
        QKeyEvent* newEvent = new QKeyEvent(QEvent::KeyPress,e->key(), e->modifiers ());
        qApp->postEvent (yourParentWdgt, newEvent, 0);
    }
}

同様に、他のタイプのキー イベントも処理できます。

于 2012-07-19T10:01:24.230 に答える