【问题标题】:QT How to check if key is pressed?QT如何检查是否按下了键?
【发布时间】: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() 中删除它们。

标签: c++ qt keypress qt-events


【解决方案1】:

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

如果你有兴趣“捕捉”一些按键事件,那么 Qt 提供了方法来做到这一点

您可以做的是将快捷方式“连接”到 lambda 或插槽,并在其中执行您需要的任何操作...例如当用户按下“control + i”时捕捉

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

【讨论】:

    【解决方案2】:

    您可以使用地图代替数组,如果您对顺序不感兴趣,则可以使用更快的 unordered_maps。键很少,所以我认为程序无论如何都会运行得很快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 2014-08-31
      • 2012-11-12
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多