QT connect使用简单介绍

如图,首先 connect是线程安全的。其次它有很多重载,当然最重要的还是QT4连接和QT5连接的区别,这个函数重载表示connect函数也是支持lambda函数的。

cpp 复制代码
connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)

connect 函数的第五个参数

了解 connect的第五个参数是非常重要的。其中Qt::UniqueConnection是比较特殊的,它仅仅用于connect的在两个对象之间一个信号和一个槽之间连接的唯一性。注意 在QT中一个对象的信号重复连接到另外一个对象的槽上,那么当信号发送时,每个连接的槽都会执行。如果只希望连接一次那么就可以使用Qt::UniqueConnection。当出现重复的连接时就会连接失败。问题 如何判断连接是否失败了?答案就是connect的返回值。

因为QMetaObject::Connection重载了运算符bool所以可以将该类直接用于条件判断。代码如下

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    QMetaObject::Connection con = connect(ui->pushButton, &QPushButton::clicked, this, &Widget::slotClicked, Qt::UniqueConnection);
    QMetaObject::Connection con_1 = connect(ui->pushButton, &QPushButton::clicked, this, &Widget::slotClicked, Qt::UniqueConnection);
    if(con_1){
        qDebug() << QStringLiteral("第二次连接成功");
    }else{
        qDebug() << QStringLiteral("第二次连接失败");
    }
}

Widget::~Widget()
{
    delete ui;
}

void Widget::slotClicked()
{
    qDebug() << QStringLiteral("按钮被点击了");
}

这里又可以体现出lambda表达式的坏处。lambda最大的好处就是使用非常方便。不好的地方有使用lambda函数导致调试困难。

cpp 复制代码
    QMetaObject::Connection con = connect(ui->pushButton, &QPushButton::clicked, this, [](){
        qDebug() << QStringLiteral("按钮被点击了");
    }, Qt::UniqueConnection);
    if(con){
        qDebug() << QStringLiteral("con连接成功");
    }else{
        qDebug() << QStringLiteral("con连接失败");
    }
    QMetaObject::Connection con_1 = connect(ui->pushButton, &QPushButton::clicked, this, [](){
        qDebug() << QStringLiteral("按钮被点击了");
    }, Qt::UniqueConnection);
    if(con_1){
        qDebug() << QStringLiteral("con_1连接成功");
    }else{
        qDebug() << QStringLiteral("con_1连接失败");
    }

此时就算两个匿名函数的函数体一样,但是由于名字不一样所以两个都可以连接成功。使用匿名函数导致调试困难

即使是debug模式仍然不会进入断点。

剩下的四个参数

Qt::AutoConnection 默认就是此链接,如果发送对象和接收对象在同一个线程,那么就是Qt::DirectConnection链接如果不是在同一个线程上那么就是Qt::QueuedConnection
Qt::BlockingQueuedConnectionQt::QueuedConnection相同,不同的是发送信号的线程将会阻塞直到被执行的槽函数返回。如果在同一个线程进行该参数的连接会导致死锁。

相关推荐
王莎莎-MinerU7 小时前
MCP 解决的是工具接入,科研 Agent 还缺的是科学证据接口标准化
开发语言·网络·人工智能·深度学习·pdf·c#·php
橘子海全栈攻城狮7 小时前
【最新源码】基于SpringBoot + Vue的超市管理系统的设计与实现D002
java·开发语言·vue.js·spring boot·后端·spring
在水一缸8 小时前
深入浅出 Catch2:现代 C++ 测试框架的优雅实践
开发语言·c++·单元测试·log4j·测试框架·catch2
-银雾鸢尾-8 小时前
C#中Object类内的方法
开发语言·c#
浮江雾8 小时前
Flutter第十节-----Flutter布局与组件全解析
android·开发语言·前端·学习·flutter·入门
爱喝水的鱼丶8 小时前
SAP-ABAP:ALV跨版本兼容指南——适配ECC与S4 HANA系统的ALV开发注意事项
开发语言·性能优化·sap·abap·经验交流
布朗克1688 小时前
Go 入门到精通-27-泛型编程
开发语言·golang·xcode·泛型编程
cui_ruicheng8 小时前
Python从入门到实战(十五):文件操作与目录管理
开发语言·python
Roy_Sashulin8 小时前
灵杉Java编程平台第一章:安装
java·开发语言
名字还没想好☜8 小时前
Go 用 errgroup 管理并发子任务:错误收敛、取消传播与限流
开发语言·后端·golang·go·并发