【问题标题】:In a QWizard, the next button cannot accept key press event, but accepts mouse press event?在 QWizard 中,下一个按钮不能接受按键事件,但接受鼠标按下事件?
【发布时间】:2012-06-04 14:01:46
【问题描述】:

我有一个类继承 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);
}

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

任何人都可以帮助找到原因,这是一个 Qt 错误吗?如何使关键事件正常工作?

【问题讨论】:

  • 你试过没有条件 if (keyEvent->key() == Qt::Key_Return || keyEvent->key() == Qt::Key_Enter)
  • 我试过了,但即使是这一行 "QKeyEvent *keyEvent = static_cast(event);"无法到达。

标签: qt mouseevent wizard qt4.7 qkeyevent


【解决方案1】:

在不安装事件过滤器的情况下尝试另一个简单的解决方案。在您的主应用程序中使用 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() 中添加鼠标点击功能。

【讨论】:

  • 谢谢,我试过了,keyPressEvent() 会被调用。但是这一行——“if (button(QWizard::NextButton)->hasFocus())”总是返回false,所以我不知道按下的按钮是否是“Next”按钮。如果在向导的“取消”或“返回”按钮上按“Enter”,函数 keyPressEvent() 将不会响应。
  • hasFocus() 如果有焦点将返回 true。您可以使用 Tab 在小部件之间遍历。而且只有当nextbutton有焦点时,return key在你的上下文中才有意义。如果它有焦点,它肯定会返回true。即使你使用eventfilter,这个问题仍然存在。
  • 我猜按键事件首先由按钮处理,然后传播到父对话框(我的向导),可能在按键事件处理期间,“下一步”按钮没有焦点。到达下一页后,“下一步”按钮再次获得焦点。问题是,当焦点项目是“取消”按钮或“返回”按钮时,按“回车”不会导致调用 keyPressEvent(),但按下任何其他键都会调用该函数。是不是说“下一步”按钮处理回车按下事件后,会将按键事件传递给父对话框?
  • Keypresssevent 在焦点位于取消或返回按钮时按回车肯定会被调用,但它不会进入 if in keypressevent 函数,因为 nextbutton 没有焦点。
猜你喜欢
  • 1970-01-01
  • 2015-08-28
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多