• qt的信号阻塞与断开


    Qt的信号阻塞与断开

    场景

    • 临时停止事件处理:一个实时图形界面中,当进行复杂的操作时,你可能需要暂时停止一些实时更新的信号,以避免过多的 Ui 刷新。
    • 优化性能:在一个实时数据处理应用中,当数据处理压力大时,暂时阻塞一些数据更新的信号,以提高性能。
    • 运行时动态管理连接:一个图形界面应用程序,根据用户选择的工具,连接不同的信号以响应鼠标点击事件。

    信号的阻塞

    在某些场景下,我们需要临时暂停信号的传递,而不是永久性的断开连接。这时,信号的阻塞就派上用场了。

    ’blockSignals‘函数的使用:

    'blockSignals’函数是QObject类的一部分,它接受一个布尔值参数,true表示阻塞信号,false表示解除阻塞。这使得我们可以在需要的时候暂时停止某些信号的处理。

    例如:

    MyEmitter emitter;
    
    // 阻塞信号
    emitter.blockSignals(true);
    
    // 发射信号,但不触发槽函数
    emit emitter.mySignal();
    
    // 解除信号阻塞
    emitter.blockSignals(false);
    
    // 发射信号,触发槽函数
    emit emitter.mySignal();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    信号的断开

    在运行时,我们可能需要动态地断开信号与槽的连接,以便更灵活地管理事件处理。

    'disconnect’函数的使用

    ‘disconnect’函数允许我们在运行时断开信号与槽的连接,提供了对连接的动态管理。

    例如:

    MyEmitter emitter;
    MyReceiver receiver;
    
    // 连接信号与槽
    QMetaObject::Connection connection = QObject::connect(&emitter, &MyEmitter::mySignal, &receiver, &MyReceiver::mySlot);
    
    // 发射信号,触发槽函数
    emit emitter.mySignal();
    
    // 断开连接
    QObject::disconnect(connection);
    
    // 发射信号,不再触发槽函数
    emit emitter.mySignal();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    场景应用示例

    为了更好地理解信号的阻塞和断开的实际应用,让我们看一个场景应用的示例:一个即时消息应用。

    示例:

    #include 
    #include 
    
    /**
     * @brief 消息发送者
     */
    class MessageSender : public QObject
    {
        Q_OBJECT
    
    signals:
        void sendMessage(QString message);
    };
    
    /**
     * @brief 消息接收者
     */
    class MessageReceiver : public QObject
    {
        Q_OBJECT
    
    public slots:
        void showMessage(QString message) {
            qDebug() << "Received message: " << message;
        }
    };
    
    int main(int argc, char *argv[])
    {
        QCoreApplication app(argc, argv);
    
        MessageSender sender;
        MessageReceiver receiver;
    
        // 连接信号与槽
        QMetaObject::Connection connection = QObject::connect(&sender, &MessageSender::sendMessage, &receiver, &MessageReceiver::showMessage);
    
        // 模拟消息发送
        emit sender.sendMessage("Hello!");
    
        // 阻塞消息发送
        sender.blockSignals(true);
    
        // 模拟消息发送,但不触发槽函数
        emit sender.sendMessage("Blocked!");
    
        // 解除消息阻塞
        sender.blockSignals(false);
    
        // 模拟消息发送,触发槽函数
        emit sender.sendMessage("World!");
    
        // 断开连接,不再接收消息
        QObject::disconnect(connection);
    
        // 模拟消息发送,不再触发槽函数
        emit sender.sendMessage("Disconnected!");
    
        return app.exec();
    }
    
    #include "main.moc"
    
    • 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

    最终将只打印 “Hello!” 和 “World!”,这就达到了我们想要的结果。

  • 相关阅读:
    VUE3 学习小记(1)
    NFT+体育,卡塔尔世界杯有哪些NFT看点!
    休闲娱乐APP,你是否感兴趣呢
    性能测试阶段6之行业流行性能监控工具
    10月20日星期五今日早报简报微语报早读
    gRPC 高级特性之 重试机制
    java计算机毕业设计云端小区物业智能管理系统源码+系统+mysql数据库+lw文档+部署
    uniapp获取设备mac地址
    阿里巴巴面试题- - -Java体系最新面试题(6)
    k8s1.24 部署springboot项目
  • 原文地址:https://blog.csdn.net/bmseven/article/details/134444352