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

如何使用QEvents在Qt中模拟QPushButton单击,qt,qtembedded,qevent,Qt,Qtembedded,Qevent,我在和嵌入式系统上有一个自定义输入设备,必须将输入转换为Qt中的适当事件。在我当前的视图中,我有一个QListView和一些QpushButton。我在我的小部件中使用以下代码 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::KeyPres

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

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\u Enter和Qt::Key\u Return,但两者都不起作用

如果在我的电脑上运行该应用程序,点击空格键或键盘上的鼠标左键可单击。这表明在某个地方,事件被更改为按钮喜欢的内容,而不是直接获得Qt::Key_空间,对吗


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

[QT\u FOLDER]/src/gui/widgets/qpushbutton.cpp:line 459

如果defaultButton设置为true,则QPushButton接受Key_Enter和Key_Return。我不知道空格键在哪里被改成了不同的东西,但我的修复方法如下:

创建类MyButton并重新实现keyPressEvent。然后只需处理Enter和Return,并调用click

应该很简单

编辑:


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

解决方案实际上非常简单。QPushButton不是在按键时单击的,而是在按键释放时单击的。下面是新代码

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));
}

您是否尝试过使用QMouseEvent发送鼠标单击按钮?我的回答有问题吗?如果有,请告诉我,我可能能帮上更多的忙。谢谢你的回复。我两种方法都试过,结果都是介于两者之间。需要it输入的小部件实现了一个事件处理程序,它将自定义输入转换为该小部件中的子部件所需的QEvents。我使用的按钮被设置为autoDefault,因此从源代码来看,它似乎也应该工作。无论如何-使用您的建议组合-自定义输入处理程序在活动按钮上调用click()。谢谢