7

我需要帮助来理解在 QT 中使用 QEvents,这让我发疯。

我正在使用自定义事件编写应用程序,但在QApplication::postEvent函数中,需要指定目标对象。

据我了解,可以将事件发布到 Qt 的事件循环中

QApplication::postEvent(obj_target, QEvent myevent);

这意味着我试图在 obj_target 中捕捉“myevent”事件并做一些事情。

但是我需要在不指定目标对象的情况下发布事件,就像 QMouseEvent 或 QKeyEvent 一样

  • 我的意思是,当单击带有很多按钮的 QMainWindow 时,我如何单击任何按钮并按下该按钮?

  • 点击事件发布时的目标对象是什么?

  • 可以注册对象以“监听”特定事件吗?

我真的很困惑,可以在不指定目标对象的情况下发布事件吗?

非常感谢您提前

4

2 回答 2

2

正如丹所说,没有简单的方法可以“在全球范围内”发布活动。本机事件的所有事件分派都是由私有 Qt 实现代码完成的。

重要的区别是:

  1. 有由操作系统传递的本机消息/事件,通常由特定于窗口的事件循环接收。

  2. 有 QEvents。

在内部,Qt 会跟踪顶级 Widget(实际上是窗口),因此当它从操作系统接收到一个事件时,它知道它应该去哪个窗口 - 例如,它可以使用平台窗口 id 来匹配它。

QEvent如果没有接收对象,传递是没有意义的,因为向对象发送事件实际上只意味着QObject::event(QEvent*)在该对象上调用该方法。没有对象实例就不可能调用这个方法!

如果你想合成一个全局的按键或鼠标点击事件,那么你必须弄清楚事件发生在什么对象上。即:

  1. 确定事件应该转到哪个顶级窗口(小部件)。您可以通过枚举顶级小部件qApp->topLevelWidgets()

  2. 识别事件应该转到的子小部件。如果是键盘事件,那么通过将事件发送到当前聚焦的小部件qApp->focusWidget()就足够了。您需要枚举子小部件以找到树中与鼠标坐标重叠的最深的小部件。

  3. 将正确的QEvent子类发送到您刚刚识别的小部件。传递到顶级小部件的事件将被路由到正确的子小部件。

发送鼠标事件时,还需要合成相关的进入和离开事件,否则就有可能使小部件处于无效状态。application.cpp源文件应该给你一些想法。

这不会让您访问本机图形项目,例如 OS X 上的菜单。

请准确告诉我们您要做什么。为什么要发布广播事件?谁收到它?由于您自己的 QObject 派生类将接收这些广播,我想,使用信号槽机制很容易。您只需将connect(...)这些接收器类添加到某些全球广播公司 QObject 的信号中。

于 2012-06-05T17:09:01.530 回答
1

为此,我有一个特定的单例类,我称之为GuiSignalHub. 它重新组合所有应用程序范围的信号。

想要触发应用程序级操作(例如打开上下文帮助)的对象只需将它们的信号连接到GuiSignalHub信号。接收器只需将其连接GuiSignalHub到其插槽即可。

于 2017-02-27T10:29:00.990 回答