2

我正在用 Qt 编写一个如下所示的程序:

屏幕截图

主窗口是我的类Window : QWidget,它有一个QGridLayout包含四个其他小部件(Input_Menu : QWidgetOutput_Menu : QWidget,然后是两个Canvas : QWidget

我想在用户按键时触发某些事件。问题是,Window有时会失去焦点(它会说Input_Menu,或者可能是Input_Menu...中的一个按钮)

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

  1. Window每当它失去它时,给它焦点。
  2. 告诉每个可能有焦点的小部件在收到键盘事件时触发Window's功能(或它的克隆)。KeyPressEvent

理想情况下,我希望如果一个小部件接收到一个事件(比如键盘事件)并且不知道如何处理它,它应该自动调用其父级的事件处理程序。我希望这是 Qt 的默认功能,但它看起来不像。另一方面,我对整个焦点问题感到非常困惑,我真的不明白发生了什么。std::cout << "key pressed" << std::endl;有人可以向我解释一下吗:我的Window::KeyPressEvent函数中包含了 a 。当我第一次运行我的程序时,似乎焦点在顶部的 QComboBox 上Input_Menu:如果我按下向上/向下键,我会在该框中导航,并且在我的控制台中没有显示“按下键”。如果我击中大多数字母,则不会发生任何事情。但是,如果我按左/右键,我的控制台中确实会出现“按下键”!?

非常感谢您的见解。

4

2 回答 2

0

您可以安装一个事件过滤器来全局QApplication过滤相关事件。QEvent::KeyPress来自 Qt 文档:

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

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

于 2012-09-05T13:41:39.960 回答
0

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

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

这已经足够好了。

于 2012-09-10T19:06:00.270 回答