V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
h3xz
V2EX  ›  Qt

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

  •  1
     
  •   h3xz · 161 天前 · 1594 次点击
    这是一个创建于 161 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假设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  
       161 天前
    总有个 main 吧,main 接收信号再传出去
    VVVYGD
        2
    VVVYGD  
       161 天前   ❤️ 1
    xiodie,看起来你是要个 eventbus
    royking930911
        3
    royking930911  
       161 天前
    设计一个消息管理器 所有需要传递消息的信号都走这个管理器的事件接口 然后这个消息管理器做成一个单例 所有对象都能拿到 过滤一下就行了
    mioktiar56
        4
    mioktiar56  
       161 天前   ❤️ 1
    推荐 eventpp 库
    Gavin999
        5
    Gavin999  
       161 天前
    好问题,应该是很多人使用 QT 的过程中都遇到过的问题。

    赞同 @royking930911

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