我在Qt编写一个程序,如下所示:
主窗口是我的班级Window : QWidget
,其中QGridLayout
包含其他四个小部件(Input_Menu : QWidget
和Output_Menu : QWidget
,然后是两个Canvas : QWidget
)< / p>
我想在用户敲击某个键时触发某些事件。问题是,Window
有时会失去焦点(比如Input_Menu
,或Input_Menu
中的按钮......)
我尝试了以下解决方案,但它们似乎并不令人满意(并且很脏):
Window
焦点。Window
的{{1}}函数(或克隆它)。理想情况下,我希望如果一个小部件收到一个事件(比如一个键盘事件)并且不知道如何处理它,它应该自动调用它的父事件处理程序。我希望这是Qt的默认功能,但它看起来不像。另一方面,我对整个焦点事情感到困惑,我真的不知道发生了什么。有人可以向我解释一下:我在KeyPressEvent
函数中添加了std::cout << "key pressed" << std::endl;
。当我第一次运行我的程序时,焦点似乎是Window::KeyPressEvent
中的顶级QComboBox:如果我按下向上/向下键,我在该框中导航并且在我的控制台中没有显示“按下键”。如果我打了大多数字母,没有任何反应。但是,如果我按下左/右键,我的控制台会按下“按键”!
提前感谢您的见解。
答案 0 :(得分:0)
您可以在QApplication
上安装事件过滤器,以全局过滤相关的QEvent::KeyPress
个事件。从Qt文档:
也可以过滤整个应用程序的所有事件, 通过在QApplication或QCoreApplication上安装事件过滤器 宾语。这样的全局事件过滤器在之前调用 特定于对象的过滤器。这非常强大,但也会变慢 事件在整个应用程序中传递每个事件;该 通常应该使用所讨论的其他技术。
除了性能方面的考虑,请记住在过滤键事件之前检查您的窗口当前是否具有焦点,或者您可能会破坏弹出对话框或输入到其他窗口。
答案 1 :(得分:0)
实际上,我发现对于修饰符的键(例如Shift,Control),Qt支持查明它们是否被按下。
例如:if(QApplication::keyboardModifiers() == Qt::ShiftModifier)
...
这已经足够了。