【发布时间】:2023-03-03 23:47:01
【问题描述】:
我希望能够随时检查该键是否被按下。我想象这样一个解决方案:
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++ 开发人员必备的技能,没有例外。在调试器的帮助下,您应该能够快速找到此程序以及您编写的所有未来程序中的所有错误,而无需向任何人寻求帮助。
-
您需要提供更多上下文(最好是minimal reproducible example)。一般来说,应用程序只有在当前具有输入焦点时才会接收按键/释放事件。
-
好的,所以方法很好,我可能在程序的另一部分有错误?代码真的很简单。这些 key...event 函数确实有效(我测试了它们),程序的另一部分只检查 isKeyPressed[ Qt::Key_Right ] 的值。
-
你甚至没有提到
isKeyPressed的类型。这使得很难判断这是否可行或只是未定义的行为(可能会或可能不会偶然崩溃)。 -
认为只有 255 个键码是错误的。 QKeyEvent::key() 返回
int(可能是 32 位),Qt::Key 中的第一个值是Qt::Key_Escape = 0x01000000。最好记住std::set<int>中的按键,然后在keyReleaseEvent()中删除它们。