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