我有一个自定义输入设备和嵌入式系统,并且必须将输入转换为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更好的东西,对吗?
任何人都知道如何才能很好地解决这个问题?我可以检查哪个(如果有的话)按钮有焦点并手动点击它,但这不是很优雅的编码......
答案 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));
}