大家好,欢迎来到IT知识分享网。
目录
完整代码下载:https://download.csdn.net/download/mars1199/
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(); // 发射信号,注意,使用阻塞队列连接时,单线程会死锁 }
完整代码下载:https://download.csdn.net/download/mars1199/
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/140247.html