0

我有一个类继承 QWizard,并添加 2 个独立的 QWizardPage(s)。在转到下一页之前,我想在第一页上做一些工作(即检查互联网连接)。用户可以通过鼠标单击“下一步”按钮,或者直接通过键盘按回车键,因为“下一步”按钮默认为焦点。所以我为按钮安装了一个事件过滤器:

按钮(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);
}

正如我多次尝试的那样,单击鼠标始终可以使我的事件处理代码运行,但按键无济于事。另一个奇怪的事情是,在按钮上按下鼠标而不释放,然后移开并释放,向导停留在第一页,现在我可以按下键,一切都好。

任何人都可以帮助找到原因,这是一个 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 回答