Qt工作笔记-对connect的第五个参数的研究
本程序配合了QObject::sender,關(guān)于QObject::sender在下面這個(gè)鏈接中:
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+" !");} }原始程序運(yùn)行截圖如下:
?
這里來看Qt中connect的第五個(gè)參數(shù),很有意思:
一個(gè)個(gè)來分析把:
Qt::AutoConnection:這個(gè)是默認(rèn)的參數(shù),當(dāng)發(fā)送信號(hào)和接收信號(hào)的在一個(gè)線程里面的時(shí)候會(huì)直接相連接;跨線程用Qt::QueuedConnection,用一個(gè)隊(duì)列,進(jìn)行處理(設(shè)計(jì)得真J8溜)
Qt::DirectConnection:在同一線程的時(shí)候直接相連,因?yàn)樵谝粋€(gè)線程里面并不會(huì)出現(xiàn)資源短缺,強(qiáng)占等問題;
Qt::QueuedConnection:這個(gè)參數(shù)和socket里面的listen的第二個(gè)參數(shù)極其相似(估計(jì)是大佬都會(huì)想到一個(gè)地方),
關(guān)于listen第二個(gè)參數(shù)的意義看這個(gè)博文:
https://blog.csdn.net/qq78442761/article/details/72917408
感覺QueuedConnection和這個(gè)差不多,就和打電話一樣。
下面兩個(gè)參數(shù)就和字面上描述的那樣。
有的時(shí)候,我們鼠標(biāo)點(diǎn)擊一下會(huì)調(diào)2次函數(shù),可以用UniqueConnection解決這個(gè)問題
?
因?yàn)槭强缇€程,把connect最后一個(gè)參數(shù)設(shè)置為Qt::DirectConnection看看QObject::sender會(huì)不會(huì)返回0
關(guān)鍵代碼如下:
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); }程序運(yùn)行截圖如下:
果然如此:
QObject::sender感覺Qt不太喜歡我們用這個(gè)函數(shù),不然在此線程調(diào)用另外一個(gè)線程的東西,這樣容易出現(xiàn)問題!!!
總結(jié)
以上是生活随笔為你收集整理的Qt工作笔记-对connect的第五个参数的研究的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt学习笔记-QSqlModel的事物操
- 下一篇: Qt学习笔记-Qt Graphic Vi