Qt工作笔记-对connect的第五个参数的研究
本程序配合了QObject::sender,關于QObject::sender在下面這個鏈接中:
https://blog.csdn.net/qq78442761/article/details/81916570
?
元素程序源碼如下:
widget.h
#ifndef WIDGET_H #define WIDGET_H#include <QWidget>class Worker;namespace Ui { class Widget; }class Widget : public QWidget {Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();public slots:void receiveBuffer(QString msg);private:Ui::Widget *ui;Worker *m_worker[3]; };#endif // WIDGET_Hworker.h
#ifndef WORKER_H #define WORKER_H#include <QThread>class Worker : public QThread {Q_OBJECT public:explicit Worker(QObject *parent = 0);~Worker();void create(const QString flag,const int delayTime);void destroy();signals:void senderBuffer(QString msg);private:QString m_flag;int m_delayTime;void run(); };#endif // WORKER_Hmain.cpp
#include "widget.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); }widget.cpp
#include "widget.h" #include "ui_widget.h" #include <QListWidgetItem> #include <QDebug> #include "worker.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);for(int i=0;i<3;i++){m_worker[i]=new Worker;connect(m_worker[i],SIGNAL(senderBuffer(QString)),this,SLOT(receiveBuffer(QString)));}m_worker[0]->create("FIRST",300);m_worker[1]->create("SECOND",400);m_worker[2]->create("THIRD",500); }Widget::~Widget() {m_worker[0]->destroy();m_worker[1]->destroy();m_worker[2]->destroy();delete ui; }void Widget::receiveBuffer(QString msg) {QListWidgetItem *item=new QListWidgetItem;msg.append(" The QObject::sender is "+QString::number((uint)QObject::sender(),16)+" !");item->setText(msg);ui->listWidget->insertItem(0,item);if(msg.contains("FIRST")){item->setTextColor(Qt::red);}else if(msg.contains("SECOND")){item->setTextColor(Qt::green);}else{item->setTextColor(Qt::blue);} }worker.cpp
#include "worker.h" #include <QDebug>Worker::Worker(QObject *parent) : QThread(parent) {}Worker::~Worker() {}void Worker::create(const QString flag, const int delayTime) {m_flag=flag;m_delayTime=delayTime;start(); }void Worker::destroy() {wait(); }void Worker::run() {while(1){QThread::msleep(m_delayTime);senderBuffer("The pointer address is "+QString::number((uint)this,16)+" . My flag is "+m_flag+" !");} }原始程序運行截圖如下:
?
這里來看Qt中connect的第五個參數,很有意思:
一個個來分析把:
Qt::AutoConnection:這個是默認的參數,當發送信號和接收信號的在一個線程里面的時候會直接相連接;跨線程用Qt::QueuedConnection,用一個隊列,進行處理(設計得真J8溜)
Qt::DirectConnection:在同一線程的時候直接相連,因為在一個線程里面并不會出現資源短缺,強占等問題;
Qt::QueuedConnection:這個參數和socket里面的listen的第二個參數極其相似(估計是大佬都會想到一個地方),
關于listen第二個參數的意義看這個博文:
https://blog.csdn.net/qq78442761/article/details/72917408
感覺QueuedConnection和這個差不多,就和打電話一樣。
下面兩個參數就和字面上描述的那樣。
有的時候,我們鼠標點擊一下會調2次函數,可以用UniqueConnection解決這個問題
?
因為是跨線程,把connect最后一個參數設置為Qt::DirectConnection看看QObject::sender會不會返回0
關鍵代碼如下:
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);for(int i=0;i<3;i++){m_worker[i]=new Worker;connect(m_worker[i],SIGNAL(senderBuffer(QString)),this,SLOT(receiveBuffer(QString)),Qt::DirectConnection);}m_worker[0]->create("FIRST",300);m_worker[1]->create("SECOND",400);m_worker[2]->create("THIRD",500); }程序運行截圖如下:
果然如此:
QObject::sender感覺Qt不太喜歡我們用這個函數,不然在此線程調用另外一個線程的東西,這樣容易出現問題!!!
總結
以上是生活随笔為你收集整理的Qt工作笔记-对connect的第五个参数的研究的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt学习笔记-QSqlModel的事物操
- 下一篇: C++ opengl 方向光