官方关于第5个参数的介绍:

Qt::AutoConnection:默认的连接方式,当发起信号和接收槽到同一线程时这个值为Qt::DirectConnection,当在不同线程时这个值为Qt::QueuedConnection。

Qt::DirectConnection:发起信号槽函数会立马触发。这个槽函数会在发起信号的线程中执行。

Qt::QueuedConnection:将信号放到队列中,然后在槽函数线程依次执行。

Qt::BlockingQueuedConnection:在Qt::QueuedConnection的基础上,信号发起者当接收者的槽没有调用完成一直处于阻塞状态,这种容易形成死锁。

Qt::UniqueConnection:这个Type可以和上面所有的类型进行组合,使用"|"连接。当要变成其他方式时,QObject::connection会返回false。连接中这种方式static_cast<Qt::ConnectionType>(Qt::QueuedConnection | Qt::UniqueConnection)。

代码结构如下:

其他源码如下:

Demo1.h

#ifndef DEMO1_H
#define DEMO1_H#include <QThread>class Demo1 : public QThread
{Q_OBJECTvoid run() override;public:void setMsg(const QString &msg);signals:void sendMsg(QString msg);private:QString m_msg;
};#endif // DEMO1_H

ReceClass.h

#ifndef RECECLASS_H
#define RECECLASS_H#include <QObject>class ReceClass : public QObject
{Q_OBJECT
public:explicit ReceClass(QObject *parent = nullptr);public slots:void receMsg(QString msg);
};#endif // RECECLASS_H

Demo1.cpp

#include "Demo1.h"
#include <QDebug>void Demo1::run()
{for(int i = 0; i < 10; i++){emit sendMsg(this->m_msg);qDebug() << QThread::currentThread() << " emit " << this->m_msg << " over";}qDebug() << QThread::currentThread() << " msg:" << this->m_msg << " over";
}void Demo1::setMsg(const QString &msg)
{this->m_msg = msg;
}

ReceClass.cpp

#include "ReceClass.h"
#include <QDebug>
#include <QThread>ReceClass::ReceClass(QObject *parent) : QObject(parent)
{}void ReceClass::receMsg(QString msg)
{qDebug() << QThread::currentThread() << " Get msg: " +  msg;QThread::sleep(1);
}

下面来测试下接受者和发起者在不同线程使用Qt::QueuedConnection会造成什么样的现象

在发起者和接受者处于不同线程中,将数据会放到一个队列中,然后慢慢进行调用。这个功能很有用,信号与槽里面自带队列结构,在很多消息处理场景里面可以用这种模式。

如下Qt::QueueConnection时,现象如下:

这里可以看到,官方说这个一般是在发起者和接受者在同一线程时使用,当在不同线程时,接受者将会被放到发起者的线程里面进行调用,这个还是比较神奇的,Qt的信号与槽还是比较牛逼的。

代码如下:

#include <QCoreApplication>
#include "Demo1.h"
#include "ReceClass.h"
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);//initReceClass receClass;Demo1 demo1;Demo1 demo2;//bind
//    QObject::connect(&demo1, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, Qt::QueuedConnection);
//    QObject::connect(&demo2, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, Qt::QueuedConnection);QObject::connect(&demo1, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, Qt::DirectConnection);QObject::connect(&demo2, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, Qt::DirectConnection);//    qDebug() << QObject::connect(&demo1, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, static_cast<Qt::ConnectionType>(Qt::QueuedConnection | Qt::UniqueConnection));
//    qDebug() << QObject::connect(&demo2, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, static_cast<Qt::ConnectionType>(Qt::QueuedConnection | Qt::UniqueConnection));
//    qDebug() << QObject::connect(&demo1, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, static_cast<Qt::ConnectionType>(Qt::DirectConnection | Qt::UniqueConnection));
//    qDebug() << QObject::connect(&demo2, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, static_cast<Qt::ConnectionType>(Qt::DirectConnection | Qt::UniqueConnection));//rundemo1.setMsg("demo1");demo2.setMsg("demo2");demo1.start();demo2.start();return a.exec();
}

如下Qt::BlockingQueueConnection时,现象如下:

他是将数据放到队列里面,然后等槽函数触发完成后,再不阻塞,这里可以看到,发起者是一个线程,调用者是另外一个线程。

下面是关于Qt::UniqueConnection的使用,这个相当于辅助。

代码如下:

#include <QCoreApplication>
#include "Demo1.h"
#include "ReceClass.h"
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);//initReceClass receClass;Demo1 demo1;Demo1 demo2;//bind
//    QObject::connect(&demo1, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, Qt::QueuedConnection);
//    QObject::connect(&demo2, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, Qt::QueuedConnection);//    QObject::connect(&demo1, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, Qt::DirectConnection);
//    QObject::connect(&demo2, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, Qt::DirectConnection);QObject::connect(&demo1, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, Qt::BlockingQueuedConnection);QObject::connect(&demo2, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, Qt::BlockingQueuedConnection);qDebug() << QObject::connect(&demo1, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, static_cast<Qt::ConnectionType>(Qt::QueuedConnection | Qt::UniqueConnection));qDebug() << QObject::connect(&demo2, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, static_cast<Qt::ConnectionType>(Qt::QueuedConnection | Qt::UniqueConnection));qDebug() << QObject::connect(&demo1, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, static_cast<Qt::ConnectionType>(Qt::DirectConnection | Qt::UniqueConnection));qDebug() << QObject::connect(&demo2, &Demo1::sendMsg, &receClass, &ReceClass::receMsg, static_cast<Qt::ConnectionType>(Qt::DirectConnection | Qt::UniqueConnection));//rundemo1.setMsg("demo1");demo2.setMsg("demo2");demo1.start();demo2.start();return a.exec();
}

运行截图如下:

可见带上这个后,QObject::connection就会绑定失败。

本次实验就这么多。

源码打包下载地址:

https://github.com/fengfanchen/Qt/tree/master/ConnectionTest

Qt笔记-对connect中第5个进行多组实验(对信号与槽进一步认识)相关推荐

  1. qt中的qwidget如何实现自定义部件_2.3信号和槽(中)

    2.3.1 在ui中编辑信号槽 这一小节我们来看一下如何在ui中编辑信号槽. 我们想要在ui中实现点击按钮,能够控制进度条的显隐. 新建GUI项目SignalsAndSlots2,类名SignalsA ...

  2. Qt工作笔记-信号与槽参数匹配问题

    今天,我把Qt3代码转化为Qt5,控件啥的都要换,李主任说了下为什么以前的信号和槽函数参数不匹配!!这句话让我对Qt中的信号与槽进一步有了了解. 下面的这个演示源码是基于这个博客的 https://b ...

  3. [Qt教程] 第44篇 进阶(四)信号和槽

    [Qt教程] 第44篇 进阶(四)信号和槽 楼主  发表于 2013-9-12 16:48:59 | 查看: 298| 回复: 0 信号和槽 版权声明 该文章原创于Qter开源社区 导语 在前面的内容 ...

  4. theoretical-零基础学Qt4编程之Qt核心机制与原理之信号与槽-

    信号与槽 信号和槽机制是Qt的核心机制之一,要掌握Qt编程就需要对信号和槽有所了解.信号和槽是一种高级接口,它们被应用于对象之间的通信,它们是Qt的核心特性,也是Qt不同于其它同类工具包的重要地方之一 ...

  5. Qt源码分析之信号和槽机制

    Qt的信号和槽机制是Qt的一大特点,实际上这是和MFC中的消息映射机制相似的东西,要完成的事情也差不多,就是发送一个消息然后让其它窗口响应,当然,这里的消息是广义的 说法,简单点说就是如何在一个类的一 ...

  6. QT的核心机制信号和槽、QT三大护法

    1.QT 三大护法 Qapplication:控制程序执行流程 QWidget:是所有界面组件类的父类,用来绘制界面 QLayout: 是一个布局管理器,可以用来设置窗口中组件的摆放方式 2.如何把信 ...

  7. Qt 信号和槽 事件处理

    一:Qt信号和槽概述 信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本章介绍了信号与槽的一些基本概念.元对象工具以及在实际使用过程中应注意的一些问题. 信号和槽机制是QT的核心机制,要精通QT ...

  8. [QT]2022.4.30 信号和槽的小玩意儿

    目录 前言: 信号和槽的自定义 关于自定义信号 自定义信号和槽的重载 信号和信号的连接 拓展 信号槽中的lamba表达式 总结 前言: 提到信号和槽(Signal & Slot),首先我们来看 ...

  9. Qt信号和槽函数连接不成功原因

    Qt信号和槽连接失败原因主要有以下几点: 1.槽函数并没有声明在类的public slots(或private slots或protected slots)里,因此,所想要成为槽函数的那个函数只是普普 ...

最新文章

  1. 2021年大数据常用语言Scala(十三):基础语法学习 函数 重点掌握
  2. DevExpress —— dxDataGrid
  3. GetFileAttributesEx读取文件相应属性
  4. jenkins docker 自动部署 构建_jenkins+docker+vue项目的自动部署环境
  5. (WPF) DataGrid之绑定
  6. 搭建自动安装的linux,RedHat7搭建无人值守自动安装Linux操作系统(PXE+Kickstart)
  7. java 上传远程图片,java上传图片到另一台服务器上,怎么解决
  8. 测试基础-06-测试计划编写
  9. 基于vue + element 的后台管理系统
  10. 正则表达式 IP域名
  11. 华为P40或将搭载鸿蒙,华为P40或将在明年3月发布,很有可能是首部搭载鸿蒙的手机...
  12. fiddler显示服务器IP
  13. 聚合物/硅胶色谱填粒径1.7μm到50μm
  14. 平面变压器的设计(翻译)(4)
  15. 微信小程序 input隐藏和不可操作的设置
  16. 阿里数据研发工程师实习生面试经历
  17. 高效工作-使用石墨文档进行信息收集
  18. CAN总线错误分析方法
  19. 发送给客户的文件,怕泄漏怎么办?
  20. 服务器网站需要多大硬盘,做网站服务器硬盘多大

热门文章

  1. python最简单的wsgi例子
  2. structs2拦截器详解
  3. 【推荐】(SqlServer)不公开存储过程sp_Msforeachtable与sp_Msforeachdb详解
  4. QTP User-Defined Function 学习经验汇总
  5. 企业要搞数字化转型,是用一整套ERP,还是各搞各的数据系统?
  6. 不懂代码,如何做出实时刷新的数据大屏?
  7. 05CRecordset类
  8. 现在的编程语言越来越多,为什么 C 和 C++ 还没有被现在的时代淘汰呢?
  9. mysql存储过程执行update_MySQL存储过程实现动态执行SQL
  10. q87主板支持cpu型号_网络上那些300多元的微星B365M主板到底是真货假货?价格便宜一半...