• 【Qt之信号和槽】对象多层嵌套后,高效使用信号和槽


    抛出问题

    Qt的信号槽机制非常牛逼,也是Qt的独特的核心功能之一。
    有时候在很多窗体中传递信号来实现更新或者处理,如果窗体层级比较多,比如窗体A的父类是窗体B,窗体B的父类是窗体C,窗体C有个子窗体D,如果窗体A一个信号要传递给窗体D,问题来了,必须先经过窗体B中转到窗体C再到窗体D才行,这样的话各种信号关联信号的connect会非常多而且管理起来比较乱

    解决方案

    可以考虑增加一个全局的单例类AppEvent,公共的信号放这里,然后窗体A对应信号绑定到AppEvent,窗体D绑定AppEvent的信号到对应的槽函数即可,干净清爽整洁。

    示例

    下面是一个简单的C++示例代码,使用全局单例类来实现在窗体层级比较多的情况下传递信号:

    #include 
    
    // 定义一个全局单例类
    class AppEvent : public QObject
    {
        Q_OBJECT
    public:
        static AppEvent* instance()
        {
            static AppEvent instance; // 构造函数为私有,只能通过静态成员函数创建实例
            return &instance;
        }
    
    signals:
        // 定义公共信号
        void signalToBeTransmitted(int value);
    };
    
    // 窗体D
    class WindowD : public QObject
    {
        Q_OBJECT
    public slots:
        // 槽函数,处理信号
        void handleSignalFromAppEvent(int value)
        {
            // 处理信号
        }
    };
    
    // 窗体A
    class WindowA : public QObject
    {
        Q_OBJECT
    public:
        WindowA()
        {
            // 将窗体A的信号连接到全局的AppEvent的信号上
            connect(this, &WindowA::signalFromWindowA, AppEvent::instance(), &AppEvent::signalToBeTransmitted);
        }
    
    signals:
        // 定义窗体A的信号
        void signalFromWindowA(int value);
    };
    
    // 窗体B
    class WindowB : public QObject
    {
        Q_OBJECT
    public:
        WindowB()
        {
            // 将AppEvent的信号连接到窗体B的槽函数上
            connect(AppEvent::instance(), &AppEvent::signalToBeTransmitted, this, &WindowB::handleSignalFromAppEvent);
        }
    
    public slots:
        // 窗体B的槽函数,处理信号
        void handleSignalFromAppEvent(int value)
        {
            // 处理信号
        }
    };
    
    // 窗体C
    class WindowC : public QObject
    {
        Q_OBJECT
    public:
        WindowC()
        {
            // 将AppEvent的信号连接到窗体C的槽函数上
            connect(AppEvent::instance(), &AppEvent::signalToBeTransmitted, this, &WindowC::handleSignalFromAppEvent);
        }
    
    public slots:
        // 窗体C的槽函数,处理信号
        void handleSignalFromAppEvent(int value)
        {
            // 处理信号
        }
    };
    
    int main()
    {
        // 创建窗体层级关系
        WindowD windowD;
        WindowC windowC;
        WindowB windowB;
        WindowA windowA;
    
        // 发射窗体A的信号
        emit windowA.signalFromWindowA(42);
    
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98

    思路

    • 定义了一个全局的单例类AppEvent,其中定义了一个公共信号signalToBeTransmitted
    • 窗体A的信号signalFromWindowA连接到了AppEvent的信号signalToBeTransmitted上,
    • 窗体D的槽函数handleSignalFromAppEvent则连接到了AppEvent的信号上,以处理信号。

    结论

    使用全局单例类AppEvent可以简化信号的传递过程,使代码更加整洁和可维护。

  • 相关阅读:
    【8.8】代码源 - 【不降子数组游戏】【最长上升子序列计数(Bonus)】【子串(数据加强版)】
    RN 事件穿透pointerEvents属性
    电脑有录屏功能吗?让我来揭开谜底!
    点击旋转箭头样式
    ethers-rs rust 创建钱包,签名消息,验证签名,恢复签名地址,签名RSV对象
    YOLOv5 结合切片辅助超推理算法 | 这才叫让小目标无处遁形!
    接口测试之文件上传
    19_数组原理内存图
    使用kubekey的all-in-one安装K8S1.24及KubeSphere3.3
    centos 下搭建nacos集群
  • 原文地址:https://blog.csdn.net/MrHHHHHH/article/details/133755793