日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt工作笔记-对connect的第五个参数的研究

發布時間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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_H

worker.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_H

main.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的第五个参数的研究的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。