发布事件而不在Qt中指定目标对象

时间:2012-02-12 07:02:31

标签: qt events qevent

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

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

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

QApplication::postEvent(obj_target, QEvent myevent);

这意味着我试图抓住" myevent" obj_target中的事件做了一些事情。

但我需要发布事件而不指定目标对象,因为QMouseEvent或QKeyEvent

  • 我的意思是,点击QMainWindow时有很多按钮,我怎么点击 按下任何按钮并按下该按钮?

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

  • 可以将对象注册到" listen"特定事件?

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

非常感谢您提前

2 个答案:

答案 0 :(得分:1)

正如Dan所说,“全球”发布活动并不是一件轻而易举的事。所有本机事件的事件调度都由私有Qt实现代码完成。

重要的区别是:

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

  2. 有QEvents。

  3. 在内部,Qt会跟踪顶级窗口小部件(真的是窗口),所以当它从操作系统收到一个事件时,它知道应该去哪个窗口 - 它可以使用平台窗口ID匹配它,例。

    没有接收对象,

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

    如果要合成全局按键或鼠标单击事件,则必须确定事件所针对的对象。即:

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

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

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

    4. 发送鼠标事件时,您还需要综合相关的进入和离开事件,否则您可能会将窗口小部件置于无效状态。 application.cpp源文件应该为您提供一些想法。

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

      请告诉我们完全您要做的事情。你为什么要发布广播活动?谁收到了?由于您自己的QObject派生类将接收这些广播,我认为,使用信号槽机制很容易。你只需要connect(...)那些接收器类到一些全球广播公司QObject的信号。

答案 1 :(得分:1)

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

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