QT信号与槽的6种连接方式以及传递参数为自定义参数时

2023-11-02


前言

QT提供了信号与槽机制来实现对象之间的通信,只有QObject及其派生类才能使用信号和槽机制,且在类之中还需要使用Q_OBJECT宏。

一、信号与槽的连接

`信号和槽通过
QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)*函数关联

信号和槽的关联关系可以有几种模式:
● 一个信号和一个槽关联;
● 一个信号和多个槽关联;
● 多个信号和一个槽关联
一个信号与多个槽关联时,在Qt5中,:
A signal can be connected to many slots and signals. Many signals can be connected to one slot.
If a signal is connected to several slots, the slots are activated in the same order in which the connections were made, when the signal is emitted.
.(一个信号连接多个槽,信号发射后,会按照链接顺序执行)。
测试如下:

connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(OnPushButtonClicked1()));
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(OnPushButtonClicked2()));
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(OnPushButtonClicked3()));

结果如下:

OnPushButtonClicked1 
OnPushButtonClicked2 
OnPushButtonClicked3 
 connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(OnPushButtonClicked2()));
 connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(OnPushButtonClicked1()));
 connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(OnPushButtonClicked3()));

结果如下:

OnPushButtonClicked2 
OnPushButtonClicked1 
OnPushButtonClicked3 

二、connect的第五个参数

参数type定义了信号和槽的关联方式。

Qt支持6种连接方式,其中3中最主要:
1.Qt::AutoConnection(自动方式)
Qt的默认连接方式,如果信号的发出和接收这个信号的对象同属一个线程,那个工作方式与直连方式相同;否则工作方式与排队方式相同。
2.Qt::DirectConnection(直接连接)(同步)
当信号发送后,相应的槽函数将立即被调用。emit语句后的代码将在所有槽函数执行完毕后被执行。
3.Qt::QueuedConnection(排队连接)(异步)
当信号发出后,排队到信号队列中,需等到接收对象所属线程的事件循环取得控制权时才取得该信号,调用相应的槽函数。emit语句后的代码将在发出信号后立即被执行,无需等待槽函数执行完毕。多线程环境下可使用。
4.Qt::BlockingQueuedConnection(阻塞连接,信号和槽必须在不同的线程中,否则就产生死锁)
发送信号后发送者所在的线程会处于阻塞状态 ,直到槽函数运行完。多线程同步环境下可使用。
5.Qt::UniqueConnection
与默认工作方式相同,只是不能重复连接相同的信号和槽,因为如果重复连接就会导致一个信号发出,对应槽函数就会执行多次。这个flag可以通过按位或(|)与以上四个结合在一起使用
6.Qt::AutoCompatConnection
是为了连接Qt4与Qt3的信号槽机制兼容方式,工作方式与Qt::AutoConnection一样。

如果这个参数不设置的话,默认表示的是那种方式呢?
没加的话与直连方式相同:当信号发出后,相应的槽函数将立即被调用。emit语句后的代码将在所有槽函数执行完毕后被执行。在这个线程内是顺序执行、同步的,但是与其它线程之间肯定是异步的了。如果使用多线程,仍然需要手动同步。

三、传递参数为自定义参数时

Qt的信号和槽可以传递int、double等c++常用类型变量,也可以传递QVector、QMap等Qt的容器类(当然也可以传递Qt定义的类型)。
传递自定义的结构体:
首先在定义结构体的同时需要使用Q_DECLARE_METATYPE。通过这个宏定义可以将自定义的类型注册到Qt的元类型中,从而被Qt识别。

struct PersonInfo
{
    QString Name;
    int age;
};
Q_DECLARE_METATYPE(PersonInfo)

其次在信号端发射的信号类型应该是QVariant,QVariant是多种类型的联合,QVariant类中有个SetValue(T& value)方法,将自定义 T 类型的数据保存到QVariant对象中,可以理解为是自定义类型被封装成了QVariant的形式,这样,我们自定义的T类型的对象就能够通过所有参数和返回值为QVarian类型传递。

signals:
    void  PersonInfoSIG(QVariant info);

在发射信号之前,将自定义的结构体用QVariant包裹一下,就可以发射了。

 QVariant DataInfo;
    DataInfo.setValue(info);
    emit PersonInfoSIG(DataInfo);

在槽函数这边,信号类型也定义为QVariant,接收后用该结构体将数据取出来就完成了自定义结构体信号的一次传递

 PersonInfo ReInfo=info.value<PersonInfo>();

扩展

信号和槽机制增强了对象间通信的灵活性,然而这也损失了一些性能。与回调函数相比较,信号和槽机制有些慢。通常,通过传递一个信号来调用槽函数将会比直接调用非虚函数慢10倍。
原因主要有:● 需要定位接收信号的对象;
● 安全地遍历所有的关联(比如,一个信号关联到多个槽的情况);
● 编组(marshal)/解组(unmarshal)传递的参数;
● 多线程的时候,信号可能需要排队等待。
然而,与创建堆对象的new操作以及删除堆对象的delete操作相比较,信号和槽的代价只是它们很少的一部分。信号和槽机制导致的这点性能损耗,对实时应用程序是可以忽略的。与信号和槽提供的灵活性和简便性相比,这点性能的损失也是值得的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT信号与槽的6种连接方式以及传递参数为自定义参数时 的相关文章

  • QTextDocument、QPdfWriter - 如何缩放输出

    我创建了一个QTextDocument里面有一张桌子 现在我尝试使用将其渲染为 PDF 格式QPdfWriter Qt 5 2 1 我就是这样做的 QPdfWriter pdfWriter output QPainter painter p
  • QML:原始模型中的动态视图重新排序

    使用此 Qt 教程通过拖动视图项来实现 QML 动态视图排序 QML 动态视图排序教程 https doc qt io qt 5 qml dynamicview tutorial html 原始底层模型是QAbstractListModel
  • 如何确定 Qt 5 中的 QtWebEngine 在运行时使用的是哪个 chromium 版本?

    我在 Qt 5 中找不到任何函数来确定使用哪个 chromium 版本QtWebEngine 我不想在代码中硬编码 chromium 版本 因为我经常更新我的应用程序 并且每个版本中的 chromium 版本通常都会更改 而且 Qt 是向后
  • 带文本的 QToolButton:覆盖最小高度以模仿常规按钮高度

    我正在显示Q工具按钮 http doc qt io qt 5 qtoolbutton html带有图标加文本的 s Qt 图标旁边的工具按钮文本 http doc qt io qt 5 qt html ToolButtonStyle enu
  • Qt 颜色选择器小部件?

    我有一个QDialog向用户提供一些选项供其选择的子类 这些选项之一是颜色 我见过QColorDialog https stackoverflow com a 1972272 2062384 我需要一些更简单的东西 这也是一个常规小部件 这
  • 设置Loader项目属性

    In the context https stackoverflow com questions 33513546 delegate folderlistmodel in tableview文件管理器 我有一个TableView组件保存在文
  • 查找 QWidget 所在的屏幕

    具有功能 QApplication desktop gt screenCount QApplication desktop gt screenGeometry 我发现我的系统上存在多少屏幕以及它们位于哪个屏幕坐标上 现在我想找出 QWidg
  • 当鼠标位于 Qt 窗口的自定义小部件上时,如何移动整个窗口?

    假设我有一个自定义小部件并将其添加到 qt 的主窗口中 如您所见 红色区域是自定义小部件 我想要做的是 当鼠标在红色区域按下并移动时 整个窗口也会移动 我知道如何简单地实施mousePressEvent and mouseMoveEvent
  • 错误“标记不是预处理器子表达式中的有效二元运算符”

    如果我构建并运行一个项目 基本上是由 Mac OS 10 6 上的 Qt 框架生成的存根 我会得到以下错误输出 Users home Qt5 0 1 5 0 1 clang 64 include QtCore qisenum h 53 Er
  • Qt 5.4/Qml:防止绑定循环

    我有一个全局单例 设置 它保存应用程序设置 当我尝试运行以下代码时 我得到一个QML CheckBox Binding loop detected for property checked CheckBox checked Settings
  • 如何将图像显示为缩略图

    我有一个QTreeView显示硬盘驱动器和目录 我也有一个QListView显示图像文件如下 但我想将图像显示为缩略图 如下所示 My code mainWidget mainWidget QWidget parent QWidget pa
  • 如何使用meta-toolchain-qt5构建Qt(带有QtWebEngine支持)?

    我正在尝试使用构建 Qtmeta toolchain qt5 但是当我通过这样做时poky glibc x86 64 meta toolchain qt5 cortexa7hf vfp vfpv4 neon toolchain 2 0 1
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • Qt:删除富文本

    对于明文有QFontMetrics elideText https doc qt io qt 5 qfontmetrics html elidedText https doc qt io qt 5 qfontmetrics html eli
  • QWinTaskbarProgress 不会显示

    我使用的是windows7和Qt5 3 0 我在 MainWindow 的构造函数中添加了以下内容 但任务栏上没有显示任何内容 我错过了什么 QWinTaskbarProgress pTaskbarProgress new QWinTask
  • Qt 5 和 QProcess 使用信号/槽 read 重定向标准输出

    这个问题困扰着我 因为它应该有效 但遗憾的是它没有 我试图实现的是读取某个进程的标准输出并让另一个进程处理它 即打印出来 产生输出的过程如下所示 include
  • 放大 QGraphicsView 时如何保持 QPen 像素宽度相同

    我编写了一个快速而令人讨厌的程序来帮助我可视化我正在从事的项目的一个方面 尽管我从 4 1 1 开始就开始使用 Qt 但我从未真正需要使用 QGraphics 模块 当我开始使用该程序时 我正在一台运行 Windows XP Qt4 7 0
  • 如何将 QByteArray 转换为十六进制字符串?

    我有打击QByteArray QByteArray ba ba 0 0x01 ba 1 0x10 ba 2 0x00 ba 3 0x07 我真的不知道如何将此 QByteArray 转换为结果字符串 其中包含 01100007 我将使用 Q
  • Qt 5.0中添加QFtp

    我需要在我的项目中使用 QFtp 类 当我使用 Qt 5 0 进行开发时 我需要从 gitorious 存储库下载该类 https qt gitorious org qt qtftp https qt gitorious org qt qt
  • Qt 5.3 QPlainTextEdit 更改 QTextCursor 颜色

    我想更改下面的光标颜色QPlainTextEdit小部件 我能够将其宽度设置为6 但我想改变颜色或者它 是否可以 QFontMetrics fm font setCursorWidth fm averageCharWidth setCurs

随机推荐

  • 如何在 Linux 中复制文件和目录

    复制文件和目录是使用命令行时最常见的任务之一 Linux 中有多种用于复制文件的命令 其中cp and rsync是使用最广泛的工具 通常的做法是使用cp复制文件的命令和rsync复制目录 为了能够复制文件和目录 您必须至少具有源文件的读取
  • 如何在 Ubuntu 18.04 上安装和使用 Docker Compose

    Docker 组合是一个允许您定义和管理多容器 Docker 应用程序的工具 它使用 YAML 文件来配置应用程序的服务 网络和卷 Compose 可用于不同的目的 单主机应用程序部署 自动化测试和本地开发是 Docker Compose
  • 如何设置无密码 SSH 登录

    Secure Shell SSH 是一种加密网络协议 用于客户端和服务器之间的安全连接 支持多种身份验证机制 两种最流行的机制是基于密码的身份验证和基于公钥的身份验证 在本教程中 我们将向您展示如何设置基于 SSH 密钥的身份验证以及如何在
  • 如何在 Ubuntu 20.04 上安装 Visual Studio Code

    视觉工作室代码是微软开发的一款功能强大的开源代码编辑器 它具有内置的调试支持 嵌入式Git控制 语法突出显示 代码完成 集成终端 代码重构和片段 Visual Studio Code 是跨平台的 可在 Windows Linux 和 mac
  • 如何在 Debian 10 Linux 上安装 Webmin

    Webmin是一个用于管理 Linux 服务器的开源 Web 控制面板 它允许您管理系统用户 组 磁盘配额以及安装和配置 Web ssh ftp 电子邮件和数据库服务器 使用 Webmin 您几乎可以配置系统的每个方面 在本教程中 我们将向
  • 如何在 Ubuntu 18.04 上安装 Kvm

    KVM 基于内核的虚拟机 是内置于 Linux 内核中的开源虚拟化技术 它允许您运行多个基于 Linux 或 Windows 的隔离来宾虚拟机 每个来宾都有自己的操作系统和专用虚拟硬件 例如 CPU 内存 网络接口和存储 本指南介绍如何在
  • 如何在 Debian 10 上安装 Elasticsearch

    Elasticsearch 是一个开源分布式全文搜索和分析引擎 它支持 RESTful 操作 允许您实时存储 搜索和分析大量数据 Elasticsearch 是最流行的搜索引擎之一 为具有复杂搜索要求的应用程序 例如大型电子商务商店和分析应
  • (see DUPEFILTER_DEBUG to show all duplicates)

    出现 see DUPEFILTER DEBUG to show all duplicates 的原因 在爬虫出现了重复的链接 重复的请求 解决方法 在request添加dont filter True
  • 常见反爬虫方法以及怎样突破

    大家可能不知道 互联网中超过一半的流量是网络爬虫贡献的 若是网站不设置反爬虫机制 可能根本没法运营 于是都设置了各种各样的反爬虫机制 即使如此 网络爬虫还是有办法去突破 今天小编为大家介绍一些常见的反网络爬虫以及突破方法 1 动态页面限制
  • [阶段4 企业开发进阶] 7. 微服务--SpringCloud Alibaba

    文章目录 1 服务注册和配置中心Nacos 1 1 Nacos简介 1 2 Nacos作为服务注册中心 服务提供者注册 服务消费者注册和负载 服务注册中心对比 1 3 Nacos作为服务配置中心 基础配置 分类配置 DataID方案配置 G
  • 转载:中国电信、网通、联通ADSL用户必读:中国电信、网通、联通劫持dns(浏览器)解决方案

    中国电信 网通 联通ADSL用户必读 中国电信 网通 联通劫持dns 中国电信 网通 联通劫持ie浏览器 解决方案D 宽带连接有 也能上网但是本地连接一直显示为受限制的解决方法 我的电脑一直显示本地连接受限制或无连接而宽带连接能连上 这是为
  • Spring Cloud 集成Gson 包冲突

    昨天再引入包的时候 Run了下main直接报错 就知道是包版本冲突了 然后添加的包排除 启动是正常了 但是项目一跑方法直接抛出来 gson转换异常 所以又得放开 于是尝试下引入Gson包试试
  • 3D文档(BRD、MRD、PRD)怎么写

    3D文档 一般来说 BRD作为战略方向的制定 是最早产出的文档 而MRD则是在战略方向的基础上对市场进行的分析 同时对后续工作的方向进行一些说明和指导 也可以说是通过对市场环境 竞品的分析 明确用户定位和产品定位的过程 PRD则是在战略方向
  • rpm的安装和卸载

    1 安装rpm包 强制安装目录下所有rpm包 rpm ivh rpm force nodeps 2 卸载rpm包 rpm e 包名 rpm nodeps
  • Buck的振铃实验与分析

    上上期我们提到了buck电路的开关的振铃波形 本质原因是LC的阻尼振荡 文章偏理论 那BUCK到底是怎么产生尖峰振荡呢 要想把这个问题搞清楚 也很是不容易 所以文章有点长 请直接点赞转发加收藏 问题 本期主要分析以下这两个问题 1 死区时间
  • 缩尾处理 stata

    要求 对连续变量上下1 的分位数进行了缩尾处理 目录 安装 具体命令 疑问1 需要对所有变量缩尾吗 疑问2 面板数据每年的截面数据分别进行处理吗 还是这么多年都混在一起处理 安装 ssc install winsor2 结果发现自己卡在了第
  • android 绘图之Path与Paint详解 - 冷冷汤圆

    http www cnblogs com aibuli p efef9d774df97c553a8a0c0c3495ba35 html utm source tuicool utm medium referral
  • 注释转换小项目(c注释->到c++注释)

    首先欢迎阅读本文 注释转换小项目涉及到c语言对文件的操作 另外这个小项目还应该对各种情况都考虑到 将c语言注释转换为c 注释 经过分析思考 我得到证据要的注释转换有以下几类 我将之整理并放入一个文件里 起名input c 1 一般情况 in
  • 【JavaScript高级】函数相关知识:函数、纯函数、柯里化、严格模式

    文章目录 函数 函数对象的属性 arguments arguments转Array 箭头函数不绑定arguments 剩余参数 rest 纯函数 定义 纯函数的案例 作用和优势 柯里化 定义 优势 自动柯里化 组合函数 定义 组合函数的封装
  • QT信号与槽的6种连接方式以及传递参数为自定义参数时

    文章目录 前言 一 信号与槽的连接 二 connect的第五个参数 三 传递参数为自定义参数时 扩展 前言 QT提供了信号与槽机制来实现对象之间的通信 只有QObject及其派生类才能使用信号和槽机制 且在类之中还需要使用Q OBJECT宏