如何使用QEvents模拟Qt中的QPushButton单击

时间:2012-01-02 09:34:16

标签: qt qtembedded qevent

我有一个自定义输入设备和嵌入式系统,并且必须将输入转换为Qt中的正确事件。在我当前的视图中,我有一个QListView和一些QPushButtons。我在我的小部件中使用以下代码。

QKeyEvent * e = NULL;
if (cmd.up.value)
    e = new QKeyEvent(QEvent::KeyPress, Qt::Key_Up, 0, 0);
else if (cmd.down.value)
    e = new QKeyEvent(QEvent::KeyPress, Qt::Key_Down, 0, 0);
else if (cmd.left.value)
    e = new QKeyEvent(QEvent::KeyPress, Qt::Key_Left, 0, 0);
else if (cmd.right.value)
    e = new QKeyEvent(QEvent::KeyPress, Qt::Key_Right, 0, 0);
else if (cmd.ok.value)
    e = new QKeyEvent(QEvent::KeyPress, Qt::Key_Space, 0, 0);

if (e)
    QApplication::postEvent(this->focusWidget(), e);

我可以在列表和按钮之间上/下/右/左移动,但我无法单击按钮。我也尝试过使用Qt :: Key_Enter和Qt :: Key_Return,但都不行。

如果在我的电脑上运行该应用程序,按键盘上的空格或鼠标左键会点击一下按钮。这表示某处,事件被改为按钮比直接获得Qt :: Key_Space更好的东西,对吗?

任何人都知道如何才能很好地解决这个问题?我可以检查哪个(如果有的话)按钮有焦点并手动点击它,但这不是很优雅的编码......

2 个答案:

答案 0 :(得分:1)

[QT_FOLDER] /src/gui/widgets/qpushbutton.cpp:line 459

如果defaultButton设置为true,QPushButton会接受Key_Enter和Key_Return。我不知道空格按钮在哪里被改变为不同的东西,但这是我的修复:

创建一个MyPushButton类并重新实现keyPressEvent。然后通过调用点击

来处理Enter和Return

应该很简单。

编辑:

或者,如果您想要花哨,可以为您的设备创建自己的自定义事件,并完全按照您的意愿处理派生类中的事件。

答案 1 :(得分:1)

解决方案实际上非常简单。 QPushButton未单击KeyPress,而是单击KeyRelease。下面的新代码。

if (cmd.up.value)
{
    QApplication::postEvent(this->focusWidget, 
                            new QKeyEvent(QEvent::KeyPress, Qt::Key_Up, 0, 0));
}
else if (cmd.down.value)
{
    QApplication::postEvent(this->focusWidget, 
                            new QKeyEvent(QEvent::KeyPress, Qt::Key_Down, 0, 0));
}
else if (cmd.left.value)
{
    QApplication::postEvent(this->focusWidget, 
                            new QKeyEvent(QEvent::KeyPress, Qt::Key_Left, 0, 0));
}
else if (cmd.right.value)
{
    QApplication::postEvent(this->focusWidget, 
                            new QKeyEvent(QEvent::KeyPress, Qt::Key_Right, 0, 0));
}
else if (cmd.ok.value) 
{
    QApplication::postEvent(this->focusWidget, 
                            new QKeyEvent(QEvent::KeyPress, Qt::Key_Space, 0, 0));
    QApplication::postEvent(this->focusWidget, 
                            new QKeyEvent(QEvent::KeyRelease, Qt::Key_Space, 0, 0));
}