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