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

2024-07-09 15:02:19 +08:00
 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

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

赞同 @royking930911

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

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

https://ex.noerr.eu.org/t/1055959

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

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

© 2021 V2EX