目录
完整代码下载:https://download.csdn.net/download/mars1199/88520061
Qt信号槽连接的函数是connect函数,共有5个参数,第五个参数是表示连接方式;
默认情况下,第五个参数是不用写的,使用的缺省值,是自动连接;
当使用自动连接的时候,单线程时,会自动切换到直接连接,多线程时会切换到队列连接;
5种连接方式:
1、自动连接
会根据线程来自动切换。
2、直接连接
单线程时使用,会同步阻塞执行,发信号之后,当槽执行完了,才能往下执行发射信号之后的代码。
3、队列连接
是一个异步非阻塞的效果,其实单线程,多线程都可以使用,当发射信号之后,不需要等待槽执行,就可以立马往下执行发射信号之后的代码。
4、阻塞队列连接
多线程同步阻塞执行的效果,必须是多线程的情况下使用,如果是单线程,则会发生死锁。
5、唯一连接
主要是用来防止相同的信号槽重复连接的。
代码如下:
自动连接代码:
connect(this,SIGNAL(mySignal()),this,SLOT(mySlot()),Qt::AutoConnection); // 自动连接
直接连接:
connect(this,SIGNAL(mySignal()),this,SLOT(mySlot()),Qt::DirectConnection); // 直接连接
队列连接:
connect(this,SIGNAL(mySignal()),this,SLOT(mySlot()),Qt::QueuedConnection); // 队列连接
阻塞队列连接:
connect(this,SIGNAL(mySignal()),this,SLOT(mySlot()),Qt::BlockingQueuedConnection); // 阻塞队列连接
唯一连接:
connect(this,SIGNAL(mySignal()),this,SLOT(mySlot()),Qt::UniqueConnection); // 唯一连接
核心代码如下:
头文件:
#include <QMainWindow>
namespace Ui {
class ConnectMainWindow;
}
class ConnectMainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit ConnectMainWindow(QWidget *parent = 0);
~ConnectMainWindow();
signals:
void mySignal(); // 自定义信号
private slots:
void mySlot(); // 自定义槽,需要有 实现
private:
Ui::ConnectMainWindow *ui;
};
源文件:
#include "connectmainwindow.h"
#include "ui_connectmainwindow.h"
#include <QDebug>
ConnectMainWindow::ConnectMainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::ConnectMainWindow)
{
ui->setupUi(this);
// 请将以下代码,依次放开注释测试即可。
connect(this,SIGNAL(mySignal()),this,SLOT(mySlot()),Qt::AutoConnection); // 自动连接
//connect(this,SIGNAL(mySignal()),this,SLOT(mySlot()),Qt::DirectConnection); // 直接连接
//connect(this,SIGNAL(mySignal()),this,SLOT(mySlot()),Qt::QueuedConnection); // 队列连接
// 单线程情况下,使用阻塞队列连接会发生死锁
//connect(this,SIGNAL(mySignal()),this,SLOT(mySlot()),Qt::BlockingQueuedConnection); // 阻塞队列连接
//之所以写2条一样的,就是为了测试有没有成功阻止重复连接
//connect(this,SIGNAL(mySignal()),this,SLOT(mySlot()),Qt::UniqueConnection); // 唯一连接
//connect(this,SIGNAL(mySignal()),this,SLOT(mySlot()),Qt::UniqueConnection); // 唯一连接
}
ConnectMainWindow::~ConnectMainWindow()
{
delete ui;
}
void ConnectMainWindow::mySlot()
{
qDebug()<<"test connect type.";
}
void ConnectMainWindow::on_pushButton_clicked()
{
emit mySignal(); // 发射信号,注意,使用阻塞队列连接时,单线程会死锁
}