【问题标题】:qt keyPress/keyRelease notify work differently on Vista and Linuxqt keyPress/keyRelease notify 在 Vista 和 Linux 上的工作方式不同
【发布时间】:2013-11-12 20:46:43
【问题描述】:

我发现 keyPress 事件在 Linux 上实际释放密钥之前不会触发。这种行为在 vista 上是不同的。这是我的应用程序中的一段代码。

当我执行以下序列时会发生差异: 1) CTRL 键按下, 2)保持一段时间 3) 释放它。

在 Linux 上,在发布之前不会打印任何内容。即在 3) 之前你什么都看不到,然后你会看到“notify::KeyPressed”和“notify::KeyReleased”。

在 Vista 上,在 1) 之后,您会看到“notify::KeyPressed”,然后在 2) 中,您可以使用 QApplication::keyboardModifier().testFlag(Qt::ControlModifier) 检测到 CTRL 已关闭。然后在 3) 之后,您会看到“notify::KeyReleased”。

我认为 vista 上发生的事情是我所期望的。如何解决 Linux 上的问题以及为什么会这样?

感谢您的帮助!

MyApplication::QApplication
{
   bool notify(Object * receiver, QEvent * event) {
       try{
           if (event->type() == QEvent::KeyPress) {
               std::cout<<"notify::KeyPressed"<<endl;
           }

           if (event->type() == QEvent::KeyRelease) {
               std::cout<<"notify::KeyReleased"<<endl;
           }


            return QApplication::notify( receiver, event );
       }
       catch ( ... ) {
          std::cerr << "Unknown Exception caught: " << ends;

       }
       return false;

    }
}

【问题讨论】:

  • 不能复现,你用的是哪个窗口管理器和哪个Qt版本?
  • 我使用的是 Qt 4.8.3。在 RHEL Linux 5 上。
  • 还有哪个窗口管理器/桌面环境?
  • 我在刀片上运行的虚拟机中使用 GNome 2.16.0。
  • 用 xev 测试过,我遇到了同样的问题。貌似是xwindow的问题,不知道怎么解决这个问题。非常感谢!

标签: linux qt keypress keyrelease


【解决方案1】:

终于找到问题了。我正在使用在刀片上运行的虚拟机。当你连接到刀片时,客户端工具,有一个选项:“Send First Key”,默认情况下是禁用的,所以当连接到虚拟机时,当你按下CTRL时,(记住第一个键是禁用的),你没有得到“keyPress”事件!启用后,它开始按预期工作!

【讨论】:

    猜你喜欢
    • 2019-05-22
    • 1970-01-01
    • 2021-03-11
    • 2012-06-04
    • 2019-01-09
    • 1970-01-01
    • 2011-02-05
    • 2017-09-08
    相关资源
    最近更新 更多