函数原型
static QMetaObject::Connection connect(const QObject *sender, const char *signal,const QObject *receiver, const char *member, Qt::ConnectionType = Qt::AutoConnection); static QMetaObject::Connection connect(const QObject *sender, const QMetaMethod &signal,const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type = Qt::AutoConnection); inline QMetaObject::Connection connect(const QObject *sender, const char *signal,const char *member, Qt::ConnectionType type = Qt::AutoConnection) const;总共有五个参数,从左到右分别为为发送的对象指针、发送信号、接收对象指针、接收对象的槽函数、连接类型。
一、用法
方法一:
使用SIGNAL和SLOT宏,qt4用法
connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(slotFunc(bool)));方法二:
直接使用函数指针,槽函数没有重载的话,直接使用函数地址就行。存在多参数情况下使用static_cast<>()--C++11,可指定参数
connect(ui->pushButton,&QPushButton::clicked,this,static_cast<void(MainWindow::*)(bool)>(&MainWindow::slotFunc));方法三:
QOverload<>::of()--qt5
connect(ui>pushButton,&QPushButton::clicked,this,QOverload<bool>::of(&MainWindow::slotFunc));方法三:
qOverload<>(),需要C++14的支持
connect(ui>pushButton,&QPushButton::clicked,this,qOverload<bool>(&MainWindow::slotFunc));方法四:
lambada表达式,一般可捕获this指针使用--C++11
connect(ui>pushButton,&QPushButton::clicked,this,[this](bool check){});二、connect失败情况
1、信号发送者或槽接收者之一已被删除,或者还没还没被创建初始化
2、尝试连接的类或对象不是从QObject派生,或者没有使用Q_OBJECT宏
三、connect断开情况
1、显示调用disconnect
2、信号发送者或槽接收者之一被删除
四、Qt::ConnectionType 参数
Qt::AutoConnection:默认参数,最安全、最常用,不用关心线程
- 同线程:立即同步调用
- 跨线程:放入接收者事件队列,异步执行
Qt::DirectConnection:直接连接
- 槽在发送者线程里立即、同步执行
- 发送者会阻塞直到槽返回
- 跨线程用不安全(可能访问 UI / 野指针)
Qt::QueuedConnection:
- 槽行为同 Queued(接收者线程事件循环执行)
- 但发送者线程会阻塞,直到槽执行完
- ⚠️严禁同线程使用→死锁
- 适合:跨线程需要同步等待结果
Qt::UniqueConnection(标志位)
- 不是独立类型,按位或组合:
Qt::UniqueConnection | Qt::QueuedConnection - 作用:同一信号 - 槽只连一次,避免重复连接
| 连接类型 | 执行线程 | 是否阻塞 | 跨线程 | 典型用途 |
|---|---|---|---|---|
| Auto | 自动 | 自动 | ✅ | 默认、通用 |
| Direct | 发送者 | ✅ 阻塞 | ❌ | 同线程高性能 |
| Queued | 接收者 | ❌ 不阻塞 | ✅ | 跨线程、UI 更新 |
| BlockingQueued | 接收者 | ✅ 阻塞 | ✅ | 跨线程同步 |