0

QWizardを継承するクラスがあり、2つの独立したQWizardPageを追加します。次のページに進む前に、最初のページでいくつかの作業(つまり、インターネット接続の確認)を行いたいと思います。ユーザーは、マウスで「次へ」ボタンをクリックするか、「次へ」ボタンがデフォルトでフォーカスされているため、キーボードで直接Enter/Returnを押すことができます。そこで、ボタンのイベントフィルターをインストールします。

button(QWizard :: NextButton)-> installEventFilter(this);

次に、ウィザードクラスで、イベント処理コードを実装します。

bool MyWizard::eventFilter(QObject *watched, QEvent *event)
{
    if (watched == button(QWizard::NextButton))
    {
        if (currentId() == startPageId)
        {
            if (event->type() == QEvent::KeyPress)
            {
                QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
                if (keyEvent->key() == Qt::Key_Return || keyEvent->key() == Qt::Key_Enter)
                {
                    // Do something. Cannot be reached.
                }
            }
            else if (event->type() == QEvent::MouseButtonPress)
            {
                // Do something. Can be reached.
            }
        }
    }    
    return QWizard::eventFilter(watched, event);
}

何度も試したように、マウスをクリックすると常にイベント処理コードが実行されますが、キーを押しても何も起こりません。もう1つの興味深い点は、ボタンを離さずにマウスを押してから、離れて離すと、ウィザードが最初のページに留まるので、キーを押すことができ、すべてOKです。

誰かが理由を見つけるのを手伝ってくれるでしょうか、それはQtのバグですか?キーイベントを正しく機能させるにはどうすればよいですか?

4

1 に答える 1

0

イベントフィルターをインストールせずに別の簡単な解決策を試してください。メインアプリでQkeyPressEventを使用してください。

void YourAppClass::keyPressEvent(QKeyEvent *e)
{
     if(Nextbutton->hasFocus() && e->key()== Qt::Key_Return || e->key() == Qt::Key_Enter)
     {
     Do your job//I guarantee this will be reached upon pressing return with button focus
     }
}

nextbuttonのclickevent()でマウスクリック機能を追加できます。

于 2012-05-30T11:13:27.617 に答える