QT 如何检查按键是否被按下?

3

我希望能够随时检测按键是否按下。我想象中的解决方案如下:

void MyQQuickPaintedItem::keyPressEvent(QKeyEvent * event)
{

  isKeyPressed[ event->key() ] = 1;

}

void MyQQuickPaintedItem::keyReleaseEvent(QKeyEvent *event)
{

  isKeyPressed[ event->key() ] = 0;

}

要检查右箭头键是否按下,只需要检查isKeyPressed[Qt::Key_Right]的值。

我实现了它...但不起作用。我的意思不是程序崩溃。isKeyPressed[Qt :: Key_Right]始终为0,即使我按下这个右箭头键或任何其他键。

编辑:

其中一个头文件:

...
bool isKeyPressed[255];
...

其中一个链接的文件:

...
extern bool isKeyPressed[255];
...

我不确定isKeyPressed应该有多大,但是我没有收到SIGSEGV的错误,所以大小可能是可以的。


当您使用调试器运行程序时,您看到了什么?这正是调试器的用途。如果您不知道如何使用调试器,那么这是一个学习如何一行一行地运行程序、监视所有变量及其值随着时间的推移而发生变化,并分析程序的逻辑执行流程的好机会。知道如何使用调试器是每个C++开发人员必备的技能,没有例外。在调试器的帮助下,您应该能够快速找到所有错误,并且无需向任何人寻求帮助即可编写出本程序和所有未来程序中的所有错误。 - Sam Varshavchik
1
你需要提供更多上下文信息(最好是一个 [mcve])。一般来说,只有当应用程序当前具有输入焦点时,它才会接收到按键/释放事件。 - G.M.
好的,那么这个方法是好的,我可能在程序的另一个部分有一个错误?代码真的非常简单。这些关键事件函数肯定有效(我已经测试过了),程序的另一部分只检查isKeyPressed [Qt :: Key_Right]的值。 - yomol777
你甚至没有提到 isKeyPressed 的类型。这使得很难判断它是否有效或者只是未定义行为(可能会偶然崩溃)。 - Scheff's Cat
1
认为只有255个键码是错误的。QKeyEvent::key() 返回 int(可能是32位),而 Qt::Key 中的第一个值是 Qt::Key_Escape = 0x01000000。更好的做法是在 std::set<int> 中记住按下的键,然后在 keyReleaseEvent() 中将其删除。 - Scheff's Cat
好的,std::unordered_map<int, bool> isKeyPressed; 对我来说是有效的,但为什么我没有收到 SIGSEGV 信号? - yomol777
2个回答

3

通常情况下,你不会这样解决问题...至少不使用QT...

如果你想要"捕捉"一些按键事件,那么Qt提供了方法来实现

你可以将快捷键与一个lambda或槽连接起来,在其中执行你需要的操作...比如捕获用户按下"control + i"的事件

connect(new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_I), this), &QShortcut::activated, [](){qDebug() << "Here we are!";});

0

如果您不关心顺序,可以使用unordered_maps,它更快,而不是使用数组。由于键值很少,所以我认为程序无论如何都会运行得很快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接