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_OBJECT
 
public:
    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不太喜欢我们用这个函数,不然在此线程调用另外一个线程的东西,这样容易出现问题!!!

————————————————
版权声明:本文为CSDN博主「IT1995」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq78442761/article/details/81937837

回答: 在Qt中,connect函数的第五个参数是连接类型(Qt::ConnectionType)。这个参数用于指定信号和槽之间的连接方式。根据引用\[1\]和引用\[2\]的描述,connect函数的第五个参数有默认值Qt::AutoConnection。而根据引用\[3\]的说明,Qt::AutoConnection是默认值,它会根据接收者和发送者是否在同一个线程来决定连接类型。如果接收者和发送者在同一个线程,则自动使用Qt::DirectConnection类型。如果接收者和发送者不在一个线程,则自动使用Qt::QueuedConnection类型。因此,Qtconnect函数的第五个参数可以用来指定连接类型,但如果不指定,默认会根据线程关系自动选择连接类型。 #### 引用[.reference_title] - *1* [Qt connect 第五个参数](https://blog.csdn.net/weixin_38416696/article/details/92795358)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Qt信号和槽机制:connect函数中的第五个参数QtConnectionType](https://blog.csdn.net/QQ1402369668/article/details/87805654)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [qtconnect参数Qt::DirectConnectionQt::QueuedConnection](https://blog.csdn.net/life_is_too_hard/article/details/52089723)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值