Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Qt中不指定目标对象的情况下发布事件_Qt_Events_Qevent - Fatal编程技术网

在Qt中不指定目标对象的情况下发布事件

在Qt中不指定目标对象的情况下发布事件,qt,events,qevent,Qt,Events,Qevent,我需要帮助了解如何在QT中使用QEvents,这让我发疯 我正在使用自定义事件编写应用程序,但正如在QApplication::postEvent函数中一样,有必要指定目标对象 据我所知,可以使用 QApplication::postEvent(obj_target, QEvent myevent); 这意味着我正试图捕捉obj_target中的“myevent”事件并做一些事情 但是我需要在不指定目标对象的情况下发布事件,就像QMouseEvent或QKeyEvent一样 我的意思是,当在

我需要帮助了解如何在QT中使用QEvents,这让我发疯

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

据我所知,可以使用

QApplication::postEvent(obj_target, QEvent myevent);
这意味着我正试图捕捉obj_target中的“myevent”事件并做一些事情

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

  • 我的意思是,当在一个有很多按钮的qmain窗口中单击时,我怎么能单击呢 有按钮吗?那个按钮被按下了吗

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

  • 是否可以注册对象以“侦听”特定事件

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


事先非常感谢

正如丹所说,没有一种简单的方式可以“全球”发布活动。本机事件的所有事件调度都是由专用Qt实现代码完成的

重要的区别是:

  • 存在由操作系统传递的本机消息/事件,通常由特定于窗口的事件循环接收

  • 有很多问题

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

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

    如果您想要合成一个全局按键或鼠标单击事件,那么您必须找出该事件指向的对象。即:

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

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

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

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

    这不允许您访问本机图形项目,例如OSX上的菜单


    请确切地告诉我们你想做什么。为什么要发布广播活动?谁收到的?由于您自己的QObject派生类将接收这些广播,我认为,使用信号槽机制非常容易。您只需
    将(…)
    这些接收器类连接到某个全球广播公司QObject的信号。

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


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

    我想应该可以回答您的问题。谢谢Mat,这是一个好的开始,但我需要知道的是,是否可以注册对象以“侦听”特定事件。我的意思是,如果我发送一个“hello”事件,拥有或注册响应该事件的对象,那么在Qt中没有接收器的事件是没有意义的。也许你可以说你在这里真正想要完成什么?从您描述的内容来看,似乎您应该使用信号/插槽而不是发送QEvents。谢谢Dan,我很困惑,您是对的,要做我想做的事情,我应该使用信号/插槽,但我现在的困惑是,QMouseEvent是如何工作的,我的意思是,当我有一个QMainWindow时,QMouseEvent类如何从鼠标接收事件。我现在也有同样的问题。我想将一个事件从顶层发布到我的应用程序中(即,好像它来自外部),所以我不想指定一个特定的对象,也许除了应用程序本身?@code\u fodder这是胡说八道,除非你说的是合成GUI事件。如果这是您想要的,那么您应该看看作为Qt一部分的测试框架。@code\u fodder,或者,如果您声称它有意义,那么请说明您所追求的确切场景,以及您想要发送的“事件”的确切示例。一般来说,这都是胡说八道。但是我们有一个问题,我们的鼠标点击进入了错误的位置,我想用正确的位置重新发送它。如果可能,请让我知道,如果不可能,请让我摆脱痛苦!:o、 谢谢@你怎么知道它出现在错误的位置?假设我给你们点击的屏幕坐标,你们下一步怎么做来确定它是错的?