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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值