Qt:键盘焦点

时间:2012-09-05 13:17:26

标签: qt focus keyboard-events qwidget

我在Qt编写一个程序,如下所示:

Screen Capture

主窗口是我的班级Window : QWidget,其中QGridLayout包含其他四个小部件(Input_Menu : QWidgetOutput_Menu : QWidget,然后是两个Canvas : QWidget)< / p>

我想在用户敲击某个键时触发某些事件。问题是,Window有时会失去焦点(比如Input_Menu,或Input_Menu中的按钮......)

我尝试了以下解决方案,但它们似乎并不令人满意(并且很脏):

  1. 只要失去它就给予Window焦点。
  2. 告诉每个可能有焦点的小部件,只要收到键盘事件,就会触发Window的{​​{1}}函数(或克隆它)。
  3. 理想情况下,我希望如果一个小部件收到一个事件(比如一个键盘事件)并且不知道如何处理它,它应该自动调用它的父事件处理程序。我希望这是Qt的默认功能,但它看起来不像。另一方面,我对整个焦点事情感到困惑,我真的不知道发生了什么。有人可以向我解释一下:我在KeyPressEvent函数中添加了std::cout << "key pressed" << std::endl;。当我第一次运行我的程序时,焦点似乎是Window::KeyPressEvent中的顶级QComboBox:如果我按下向上/向下键,我在该框中导航并且在我的控制台中没有显示“按下键”。如果我打了大多数字母,没有任何反应。但是,如果我按下左/右键,我的控制台会按下“按键”!

    提前感谢您的见解。

2 个答案:

答案 0 :(得分:0)

您可以在QApplication上安装事件过滤器,以全局过滤相关的QEvent::KeyPress个事件。从Qt文档:

  

也可以过滤整个应用程序的所有事件,   通过在QApplication或QCoreApplication上安装事件过滤器   宾语。这样的全局事件过滤器在之前调用   特定于对象的过滤器。这非常强大,但也会变慢   事件在整个应用程序中传递每个事件;该   通常应该使用所讨论的其他技术。

除了性能方面的考虑,请记住在过滤键事件之前检查您的窗口当前是否具有焦点,或者您可能会破坏弹出对话框或输入到其他窗口。

答案 1 :(得分:0)

实际上,我发现对于修饰符的键(例如Shift,Control),Qt支持查明它们是否被按下。

例如:if(QApplication::keyboardModifiers() == Qt::ShiftModifier) ...

这已经足够了。