gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:42:39 25 4
gpt4 key购买 nike

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

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

据我了解,可以使用

将事件发布到 Qt 的事件循环
QApplication::postEvent(obj_target, QEvent myevent);

这意味着我正在 try catch obj_target 中的“myevent”事件并执行一些操作。

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

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

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

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

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

提前非常感谢

最佳答案

正如丹所说,没有什么简单的方法可以“在全局范围内”发布事件。 native 事件的所有事件调度均由私有(private) Qt 实现代码完成。

重要的区别是:

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

  2. 有 QEvent。

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

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

如果你想合成一个全局的按键或鼠标点击事件,那么你必须弄清楚该事件转到哪个对象。即:

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

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

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

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

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

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

关于qt - 在 Qt 中发布事件而不指定目标对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9247078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com