我需要帮助才能理解在QT中使用QEvents,这让我发疯了。
我正在使用自定义事件编写应用程序,但在QApplication::postEvent
函数中,必须指定目标对象。
据我所知,可以将事件发布到Qt的事件循环中
QApplication::postEvent(obj_target, QEvent myevent);
这意味着我试图抓住" myevent" obj_target中的事件做了一些事情。
但我需要发布事件而不指定目标对象,因为QMouseEvent或QKeyEvent
我的意思是,点击QMainWindow时有很多按钮,我怎么点击 按下任何按钮并按下该按钮?
发布点击事件时的目标对象是什么?
可以将对象注册到" listen"特定事件?
我真的很困惑,可以在不指定目标对象的情况下发布事件吗?
非常感谢您提前
答案 0 :(得分:1)
正如Dan所说,“全球”发布活动并不是一件轻而易举的事。所有本机事件的事件调度都由私有Qt实现代码完成。
重要的区别是:
操作系统提供的本机消息/事件通常由特定于窗口的事件循环接收。
有QEvents。
在内部,Qt会跟踪顶级窗口小部件(真的是窗口),所以当它从操作系统收到一个事件时,它知道应该去哪个窗口 - 它可以使用平台窗口ID匹配它,例。
没有接收对象, QEvent
传递是没有意义的,因为向对象发送事件实际上只意味着在该对象上调用QObject::event(QEvent*)
方法。没有对象实例就不可能调用这个方法!
如果要合成全局按键或鼠标单击事件,则必须确定事件所针对的对象。即:
确定事件应该转到哪个顶级窗口(窗口小部件)。您可以通过qApp->topLevelWidgets()
枚举顶级小部件。
确定事件应该转到的子窗口小部件。如果是键盘事件,则通过qApp->focusWidget()
将事件发送到当前关注的小部件就足够了。您需要枚举子窗口小部件,以找到树中与鼠标坐标重叠的最深部窗口小部件。
将正确的QEvent
子类发送到您刚识别的小部件。传递到顶级窗口小部件的事件将路由到正确的子窗口小部件。
发送鼠标事件时,您还需要综合相关的进入和离开事件,否则您可能会将窗口小部件置于无效状态。 application.cpp
源文件应该为您提供一些想法。
这不允许您访问本机图形项,例如OS X上的菜单。
请告诉我们完全您要做的事情。你为什么要发布广播活动?谁收到了?由于您自己的QObject派生类将接收这些广播,我认为,使用信号槽机制很容易。你只需要connect(...)
那些接收器类到一些全球广播公司QObject的信号。
答案 1 :(得分:1)
为此,我有一个特定的单例类,我称之为GuiSignalHub
。它重新组合了所有应用程序范围的信号。
想要触发应用程序级操作的对象(例如打开上下文帮助)只是将其信号连接到GuiSignalHub
信号。接收者只需将GuiSignalHub
连接到他们的插槽。