如果用官方的写法on_btn_pressed()可以不用写connect函数,可以直接触发槽函数。如果此时用connect再次连接的话,就会导致on_btn_pressed()被执行两次。
Qt信号-槽连接函数原型如下:
1 | bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection ) |
Qt支持5种连接方式
- Qt::DirectConnection(直连方式)(信号与槽函数关系类似于函数调用,同步执行)
当信号发出后,相应的槽函数将立即被调用。emit语句后的代码将在所有槽函数执行完毕后被执行。
当信号发射时,槽函数将直接被调用。
无论槽函数所属对象在哪个线程,槽函数都在发射信号的线程内执行。
- Qt::QueuedConnection(队列方式)(此时信号被塞到事件队列里,信号与槽函数关系类似于消息通信,异步执行)
当信号发出后,排队到信号队列中,需等到接收对象所属线程的事件循环取得控制权时才取得该信号,调用相应的槽函数。emit语句后的代码将在发出信号后立即被执行,无需等待槽函数执行完毕。
当控制权回到接收者所依附线程的事件循环时,槽函数被调用。
槽函数在接收者所依附线程执行。
- Qt::AutoConnection(自动方式)
Qt的默认连接方式,如果信号的发出和接收信号的对象同属一个线程,那个工作方式与直连方式相同;否则工作方式与队列方式相同。
如果信号在接收者所依附的线程内发射,则等同于直接连接
如果发射信号的线程和接受者所依附的线程不同,则等同于队列连接
- Qt::BlockingQueuedConnection(信号和槽必须在不同的线程中,否则就产生死锁)
槽函数的调用情形和Queued Connection相同,不同的是当前的线程会阻塞住,直到槽函数返回。
- Qt::UniqueConnection
与默认工作方式相同,只是不能重复连接相同的信号和槽,因为如果重复连接就会导致一个信号发出,对应槽函数就会执行多次。
参考链接
- QT按钮被触发两次的问题,by 不二侬.
- QVariant的用法,by 十年之少.
- QT入门系列(4):QString与int相互转换方法,by 李奕锋.
- 深入理解QT多线程编程,by 编程宝库.
- 在Qt(C++)中使用QThread实现多线程,by 星夜之夏.
- Q_OBJECT宏的作用,by 沈子恒.