如何在 QT 中的多个级别的窗口之间传输消息 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
h3xz
V2EX    Qt

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

  •  1
     
  •   h3xz 2024-07-09 15:02:19 +08:00 2196 次点击
    这是一个创建于 459 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假设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

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

    赞同 @royking930911

    QT 的对象都有保存自己的子对象 List ,而一般都是通过一个或几个根窗口拓展的子窗口,然后通过一个对象名称来查询对象指针,直接通过指针绑定信号槽函数。而不用反复从内向外通过多次信号槽的连接完成消息传递。
    jones2000
        6
    jones2000  
       2024-07-09 16:36:36 +08:00
    postmessage 自己控制下发送的窗口
    h3xz
        7
    h3xz  
    OP
       2024-07-09 17:11:24 +08:00
    @royking930911 非常感谢您提供的方法。我自己的解决方案与您的有点类似:创建了一个单例类 EventManagement ,form_B 和 form_D 通过 EventManagement 来进行信号的传递。我对于"设计一个消息管理器 所有需要传递消息的信号都走这个管理器的事件接口"这句话不是很明白,能否麻烦您进一步说明。
    bugmaker233
        8
    bugmaker233  
       2024-07-09 17:20:40 +08:00
    所有对象指针放在父窗口中,信号槽连接不就行了,反正 QT 都不用手动删除
    h3xz
        9
    h3xz  
    OP
       2024-07-09 17:27:15 +08:00
    @bugmaker233 1.子窗口对象如果没有初始化的话,直接用 connect 会出现警告 qt.core.qobject.connect: QObject::connect(QPushButton, Unknown): invalid nullptr parameter 。2.若子窗口数量太多,全部创建后非常占用内存
    royking930911
        10
    royking930911  
       2024-07-09 17:40:29 +08:00   1
    @h3xz 简单点就是你理解的这种 复杂点就涉及到消息过滤问题
    如果你的软件业务比较多 不可能给管理器增加多个信号转发接口 也不可能使用同一个进行广播 每个接收消息的对象都要对消息进行判断的话效率很低
    建议将消息订阅的对象进行分组管理,这样消息管理器提供了分发消息的能力 既可以广播 也可以多播
    至于使用何种技术 关键字 QMetaObject::invokeMethod()
    darcyC
        11
    darcyC  
       2024-07-09 17:49:28 +08:00
    我是自己建了一个类(单例)专门放公共信号,这个类继承自 QObject 就可以定义 signals 了
    timethinker
        12
    timethinker  
       2024-07-09 17:51:55 +08:00
    观察者模式,通过事件订阅和发布来解耦对象之间的引用关系。
    openmm
        13
    openmm  
       2024-07-09 18:02:52 +08:00
    可以不用信号槽,整个单例类传 std::function 函数指针,当做回调
    royking930911
        14
    royking930911  
       2024-07-09 18:07:07 +08:00
    @openmm Qt 的信号槽机制很好的解决了线程的同步异步问题 直接回调的话 一些复杂的操作可能会引起交互层的卡顿
    jamesdd
        15
    jamesdd  
       2024-07-09 22:55:52 +08:00
    3 楼的方法可以。他的意思应该是你可以定义一个 signal 带参数,通过参数区分 trigger ;或者可以定义多个 signal ,不用带参数
    h3xz
        16
    h3xz  
    OP
       2024-07-10 09:17:05 +08:00
    @royking930911 非常感谢
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     950 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 22:54 PVG 06:54 LAX 15:54 JFK 18:54
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86