2

我在嵌入式系统上有一个自定义输入设备,并且必须将输入转换为 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 更喜欢的东西,对吧?

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

4

2 回答 2

1

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

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

创建一个 MyPushButton 类并重新实现 keyPressEvent。然后只需通过调用单击来处理 Enter 和 Return

应该很简单。

编辑:

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

于 2012-01-03T12:13:02.567 回答
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));
}
于 2012-01-13T11:03:27.767 回答