我需要帮助才能理解在QT中使用QEvents,这让我发疯了.
我正在使用自定义事件编写应用程序,但在QApplication::postEvent
功能中,必须指定目标对象.
据我所知,可以将事件发布到Qt的事件循环中
QApplication::postEvent(obj_target, QEvent myevent);
Run Code Online (Sandbox Code Playgroud)
这意味着我正试图在obj_target中捕捉"myevent"事件做一些事情.
但我需要发布事件而不指定目标对象,如QMouseEvent或QKeyEvent
我的意思是,当点击带有很多按钮的QMainWindow时,我怎么能点击任何按钮并按下该按钮?
发布点击事件时的目标对象是什么?
注册对象可以"监听"特定事件吗?
我真的很困惑,可以在不指定目标对象的情况下发布事件吗?
非常感谢你提前
正如丹所说,“全球”发布事件的方式并不简单。本机事件的所有事件调度均由私有 Qt 实现代码完成。
重要的区别是:
有由操作系统传递的本机消息/事件,通常由特定于窗口的事件循环接收。
有 QEvent。
在内部,Qt 跟踪顶级 Widget(实际上是窗口),因此当它从操作系统接收到事件时,它知道应该转到哪个窗口 - 例如,它可以使用平台窗口 id 来匹配它。
QEvent
如果没有接收对象,传递就没有意义,因为向对象发送事件实际上仅意味着QObject::event(QEvent*)
在该对象上调用该方法。如果没有对象实例,就不可能调用此方法!
如果你想合成一个全局的按键或鼠标点击事件,那么你必须弄清楚该事件去了哪个对象。即:
确定事件应该转到哪个顶级窗口(小部件)。您可以通过 枚举顶级小部件qApp->topLevelWidgets()
。
确定事件应该发送到的子部件。如果它是键盘事件,则通过将事件发送到当前聚焦的小部件qApp->focusWidget()
就足够了。您需要枚举子窗口小部件以找到树中与鼠标坐标重叠的最深的窗口小部件。
将正确的QEvent
子类发送到您刚刚识别的小部件。传递到顶级小部件的事件将被路由到正确的子小部件。
发送鼠标事件时,您还需要合成相关的进入和离开事件,否则您将面临使小部件处于无效状态的风险。这application.cpp
文件应该会给你一些想法。
这不会让您访问本机图形项目,例如 OS X 上的菜单。
请准确地告诉我们您想做什么。为什么要发布广播事件?谁收到它?由于您自己的 QObject 派生类将接收这些广播,我认为使用信号槽机制很容易。您只需将connect(...)
这些接收器类发送到某些全球广播公司 QObject 的信号即可。