Qt 在QQ向导中,“下一步”按钮不能接受按键事件,但接受鼠标按下事件?

Qt 在QQ向导中,“下一步”按钮不能接受按键事件,但接受鼠标按下事件?,qt,mouseevent,wizard,qt4.7,qkeyevent,Qt,Mouseevent,Wizard,Qt4.7,Qkeyevent,我有一个类继承了QWizard,并添加了两个独立的QWizard页面。在进入下一页之前,我想在第一页做一些工作(即检查互联网连接)。用户可以通过鼠标单击“下一步”按钮,也可以通过键盘直接按enter/return,因为默认情况下“下一步”按钮是聚焦的。因此,我为按钮安装了eventfilter: 按钮(QWizard::NextButton)->installEventFilter(此) 然后在向导类中实现事件处理代码: bool MyWizard::eventFilter(QObject *w

我有一个类继承了QWizard,并添加了两个独立的QWizard页面。在进入下一页之前,我想在第一页做一些工作(即检查互联网连接)。用户可以通过鼠标单击“下一步”按钮,也可以通过键盘直接按enter/return,因为默认情况下“下一步”按钮是聚焦的。因此,我为按钮安装了eventfilter:

按钮(QWizard::NextButton)->installEventFilter(此)

然后在向导类中实现事件处理代码:

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);
}
bool MyWizard::eventFilter(QObject*监视,QEvent*事件)
{
如果(监视==按钮(QWizard::NextButton))
{
if(currentId()==startPageId)
{
如果(事件->类型()==QEvent::按键)
{
QKeyEvent*keyEvent=静态广播(事件);
如果(keyEvent->key()==Qt::key_返回| | keyEvent->key()==Qt::key_回车)
{
//做点什么。联系不到。
}
}
else if(事件->类型()==QEvent::MouseButtonPress)
{
//做点什么。可以联系到。
}
}
}    
返回QWizard::eventFilter(已监视,事件);
}
正如我多次尝试的那样,单击鼠标总是可以使我的事件处理代码运行,但按下该键则无能为力。另一件奇怪的事情是,按下按钮上的鼠标而不释放,然后移开并释放,向导停留在第一页,现在我可以按下键,一切都好了


有人能帮忙找出原因吗,这是Qt错误吗?如何使关键事件正常工作

在不安装事件过滤器的情况下尝试另一个简单的解决方案。在主应用程序中使用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
     }
}

您可以在下一个按钮的clickevent()中添加鼠标单击功能。

如果(keyEvent->key()==Qt::key\u Return | | | keyEvent->key()==Qt::key\u Enter)我尝试过,但即使是这一行“QKeyEvent*keyEvent=static\u cast(event);”也无法访问,谢谢,正如我尝试过的那样,keyPressEvent()将被调用。但是行--“if(button(button)(QWizard::NextButton)->hasFocus())”总是返回false,所以我不知道按下的按钮是否是“Next”按钮。如果在向导的“取消”或“返回”按钮上按“回车”,函数keyPressEvent()将不会响应。如果有焦点,hasFocus()将返回true。您可以使用Tab在小部件之间进行遍历。而且,仅当nextbutton具有焦点时,return key在您的上下文中才有意义。如果具有焦点,它肯定会返回true。即使使用eventfilter,此问题仍然存在。我猜按键事件首先由按钮处理,然后传播到父对话框(我的向导),可能在按键事件处理期间,“下一步”按钮没有焦点。到达下一页后,“下一步”按钮再次获得焦点。问题是,当焦点项目是“取消”按钮或“返回”按钮时,按“回车”键不会导致调用keyPressEvent(),但按任何其他键都会调用该函数。这是否意味着在“下一步”按钮处理enter press事件后,它将把按键事件传递给父对话框?当焦点位于cancel(取消)或back(后退)按钮上时按enter键时,肯定会调用keypressevent,但由于nextbutton(下一步)按钮没有焦点,它不会进入if in keypressevent功能。