如何在 QT 中的多个级别的窗口之间传输消息

168 天前
 h3xz

假设form_Bform_Cform_A下创建,然后form_Dform_C下创建。form_B如何从form_D获得信号?

我的想法是先将信号从form_D传递到form_C,然后再传递到form_A,最后form_A将信号传递到form_B。然而,这样会有很多与各种信号相关的连接,并且很难管理。 真诚地请教下是否有其他方法可以管理这么多信号。真诚地询问是否有更方便的方法来管理信号,将信号从form_D传输到form_B

1605 次点击
所在节点    Qt
16 条回复
NoOneNoBody
168 天前
总有个 main 吧,main 接收信号再传出去
VVVYGD
168 天前
xiodie,看起来你是要个 eventbus
royking930911
168 天前
设计一个消息管理器 所有需要传递消息的信号都走这个管理器的事件接口 然后这个消息管理器做成一个单例 所有对象都能拿到 过滤一下就行了
mioktiar56
168 天前
推荐 eventpp 库
Gavin999
168 天前
好问题,应该是很多人使用 QT 的过程中都遇到过的问题。

赞同 @royking930911

QT 的对象都有保存自己的子对象 List ,而一般都是通过一个或几个根窗口拓展的子窗口,然后通过一个对象名称来查询对象指针,直接通过指针绑定信号槽函数。而不用反复从内向外通过多次信号槽的连接完成消息传递。
jones2000
168 天前
postmessage 自己控制下发送的窗口
h3xz
168 天前
@royking930911 非常感谢您提供的方法。我自己的解决方案与您的有点类似:创建了一个单例类 EventManagement ,form_B 和 form_D 通过 EventManagement 来进行信号的传递。我对于"设计一个消息管理器 所有需要传递消息的信号都走这个管理器的事件接口"这句话不是很明白,能否麻烦您进一步说明。
bugmaker233
168 天前
所有对象指针放在父窗口中,信号槽连接不就行了,反正 QT 都不用手动删除
h3xz
168 天前
@bugmaker233 1.子窗口对象如果没有初始化的话,直接用 connect 会出现警告 qt.core.qobject.connect: QObject::connect(QPushButton, Unknown): invalid nullptr parameter 。2.若子窗口数量太多,全部创建后非常占用内存
royking930911
168 天前
@h3xz 简单点就是你理解的这种 复杂点就涉及到消息过滤问题
如果你的软件业务比较多 不可能给管理器增加多个信号转发接口 也不可能使用同一个进行广播 每个接收消息的对象都要对消息进行判断的话效率很低
建议将消息订阅的对象进行分组管理,这样消息管理器提供了分发消息的能力 既可以广播 也可以多播
至于使用何种技术 关键字 QMetaObject::invokeMethod()
darcyC
168 天前
我是自己建了一个类(单例)专门放公共信号,这个类继承自 QObject 就可以定义 signals 了
timethinker
168 天前
观察者模式,通过事件订阅和发布来解耦对象之间的引用关系。
openmm
168 天前
可以不用信号槽,整个单例类传 std::function 函数指针,当做回调
royking930911
168 天前
@openmm Qt 的信号槽机制很好的解决了线程的同步异步问题 直接回调的话 一些复杂的操作可能会引起交互层的卡顿
jamesdd
168 天前
3 楼的方法可以。他的意思应该是你可以定义一个 signal 带参数,通过参数区分 trigger ;或者可以定义多个 signal ,不用带参数
h3xz
167 天前
@royking930911 非常感谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1055959

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX