当前位置: 首页 > news >正文

Qt 信号与槽的使用详解 - 多种绑定形式、同步异步、Lambda表达式等

Qt 信号与槽的使用详解 - 多种绑定形式、同步异步、Lambda表达式等

  • 引言
  • 一、信号与槽常见的绑定形式
  • 二、信号与槽的连接方式 - 同步异步

引言

在Qt框架中,信号与槽(Signals and Slots)机制是一种强大的通信方式,它允许对象之间进行通信而无需知道彼此的详细实现。这种机制是Qt的核心特性之一,广泛应用于事件处理和对象间的通信,能够大大简化编程的复杂性,提高代码的可维护性和可扩展性。

一、信号与槽常见的绑定形式

使用connect连接信号 (槽函数的参数个数必须小于等于信号函数的参数个数)

    1. connect函数指针 (推荐),例程如下:
      QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection)
	QLabel *label = new QLabel;QLineEdit *lineEdit = new QLineEdit;QObject::connect(lineEdit, &QLineEdit::textChanged,label,  &QLabel::setText);
	connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::slot_cs);  // slot_cs是一个普通的槽函数

Qt 5中推荐的信号与槽连接语法,支持函数提示 - 函数补全,会在编译时检查到连接错误

    1. Lambda表达式(推荐) - 连接和槽函数的实现写在一切,方便、简洁且直观,例程如下:
      QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type = Qt::AutoConnection)
  QByteArray page = ...;QTcpSocket *socket = new QTcpSocket;socket->connectToHost("qt-project.org", 80);QObject::connect(socket, &QTcpSocket::connected, this, [=] () {socket->write("GET " + page + "\r\n");}, Qt::AutoConnection);

lambda表达式(函数)详解:https://blog.csdn.net/LF__plus/article/details/136873469 - 表达式结构、参数解释

还有个类似的QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, Functor functor),少了接受者。

    1. 标准connect连接(不推荐) - QT4老语法,例程如下:
      QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
  QLabel *label = new QLabel;QScrollBar *scrollBar = new QScrollBar;QObject::connect(scrollBar, SIGNAL(valueChanged(int)),label,  SLOT(setNum(int)));

需要注意,signal和slots参数不能包含任何变量名,只能包含类型。相比connect函数指针的连接方式,不能进行函数补全,由于使用宏将信号和槽函数转换为字符串,如果有问题在运行时候才会报错,编译阶段不检查。
还有一个类似的QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type = Qt::AutoConnection),使用QMetaMethod作为信号和槽函数,而不是字符串.

    1. 界面上设置
      1)- 右键控件 - 点击转到槽 - 点击相应的信号,自动生成相应的槽函数,默认绑定无需connect
      2)- 在ui设计界面底部,添加信号和槽的对应关系,如下图所示:
      在这里插入图片描述

一般用的不多的知识点:

  1. 将一个信号连接到另一个信号上,当第一个信号发射时,会触发第二个信号
  2. 信号和槽可以重载,使用QOverload 和 QMetaObject::Connection处理重载信号和槽
  3. 一个信号可以连接多个槽,一个槽也能被多个信号连接
  4. 使用disconnect断开信号和槽的连接
  5. 一个信号和一个槽函数和进行多次connect连接,一次触发多次执行… 可以设置连接类型来规避这种情况UniqueConnection
  6. 发送信号不用加emit也行

可参考:

  1. Qt中connect()方法的一些常见用法:https://blog.csdn.net/weixin_42478379/article/details/137682367
  2. QT标准connect连接(QT4老语法):https://zhuanlan.zhihu.com/p/692721646
  3. QT 信号与槽4种绑定形式:https://blog.csdn.net/weixin_42127524/article/details/131189259
  4. 槽函数被执行多次的解决方法及Qt::UniqueConnection作用及和其它连接类型的“与”操作写法:https://blog.csdn.net/danshiming/article/details/123162126
  5. Qt信号槽/使用问题:https://blog.csdn.net/quguanxin/article/details/102843961

二、信号与槽的连接方式 - 同步异步

信号与槽的连接最后有一个枚举参数Qt::ConnectionType type = Qt::AutoConnection,默认自动。此参数主要表示信号是立即发出还是排队等待:

常量
描述
Qt::AutoConnection0(默认) 发送接收在同一线程,则Qt::DirectConnection,否则Qt::QueuedConnection
Qt::DirectConnection1发出信号时会立即槽函数,在信号发出者的线程中执行。
Qt::QueuedConnection2在接受者的事件循环(线程)中调用。- 异步
Qt::BlockingQueuedConnection3Qt::QueuedConnection一样,也在接受者线程中调用,但是发送信号的线程会被阻塞,直到槽函数执行完毕 (防止槽函数和信号线程对某个值的操纵冲突)。 - 同步
Qt::UniqueConnection0x80一个标志,可以与上述连接方式进行组合 保证同一信号和同一槽函数只能连接一次,再次connect连接会失败。
  1. 对于排队连接Qt::QueuedConnection,参数必须是Qt的元对象系统已知的类型,因为Qt需要复制参数以将其存储在幕后事件中。如若是自定义类型,可以使用qRegisterMetaType()注册一下。
  2. 对于Qt::BlockingQueuedConnection,不能用于发送者接受者在同一个线程的情况,会引起死锁。 - (为啥?可参考博客:由Qt::BlockingQueuedConnection引起的关闭Qt主页面而后台仍有进程残留:https://blog.csdn.net/youzai2017/article/details/132746319)
  3. 当Lambda表达式作为槽函数时,记得使用以上推荐的方式,写全参数。如果省略接受者,默认会在发送者的线程中直接执行。- 比如一个线程发出信号,主线程(UI)线程响应修改相关UI,不写接受者是主线程,会冲突报错,因为只有主线程(UI)线程可以修改UI。

相关文章:

Qt 信号与槽的使用详解 - 多种绑定形式、同步异步、Lambda表达式等

Qt 信号与槽的使用详解 - 多种绑定形式、同步异步、Lambda表达式等 引言一、信号与槽常见的绑定形式二、信号与槽的连接方式 - 同步异步 引言 在Qt框架中,信号与槽(Signals and Slots)机制是一种强大的通信方式,它允许对象之间进…...

Harbor本地仓库搭建002_Harbor负载均衡节点搭建_nginx安装配置_harbor安装---分布式云原生部署架构搭建002

负载均衡的机器. 可以看到上面是安装nginx的过程 首先去编辑一下yum仓库地址,配置一下nginx的仓库地址 然后这个是配置的内容 然后在进行安装之前最好yum makecache fast 更新一下缓存,这样安装的时候 会安装最新的包 然后就可以安装nginx yum -y install nginx 然后去...

《单元测试之道Java版——使用JUnit》学习笔记汇总

前言 主要用来记录《单元测试之道Java版——使用JUnit》书中的一些必要知识,方便后期编程使用。 目录 序言你的首个单元测试使用Junit编写测试测试哪些内容:Right-BICEPCORRECT边界条件使用Mock对象好的测试所具有的品质在项目中进行测试设计话题 后…...

项目实训-vue(十一)

项目实训-vue&#xff08;十一&#xff09; 文章目录 项目实训-vue&#xff08;十一&#xff09;1.概述2.页顶导航栏3.导航信息4.总结 1.概述 本篇博客将记录我在图片上传页面中的工作。 2.页顶导航栏 <divstyle"display: flex;justify-content: space-between;alig…...

计算机网络-BGP路由负载分担

在大型网络中&#xff0c;到达同一目的地通常会存在多条有效BGP路由&#xff0c;设备只会优选一条最优的BGP路由&#xff0c;将该路由加载到路由表中使用&#xff0c;这一特点往往会造成很多流量负载不均衡的情况。 通过配置BGP负载分担&#xff0c;可以使得设备同时将多条等代…...

Python爬取中国福彩网彩票数据并以图表形式显示

网页分析 首先打开中国福彩网&#xff0c;点击双色球&#xff0c;选择往期开奖栏目 进入栏目后&#xff0c;选定往期的奖金数目作为我们想要爬取的目标内容 明确目标后&#xff0c;开始寻找数据所在的位置 鼠标右击页面&#xff0c;打开网页源代码&#xff0c;在源代码中搜索…...

0621作业

目录 多线程并发服务器模型服务器实现 select的TCP服务器模型服务器实现 select的TCP客户端实现 多线程并发服务器 模型 sfd socket(); bind(); listen(); while(1){newfd accept();pthread_create(&tid, NULL, do_cli_msg, [newfd, cin]集合);pthread_detach(tid); } …...

ps基础入门

1.基础 1.1新建文件 1.2创建指定形状 1.4移动工具 1.41移动画布中的任意元素 1.42移动画布 1.43修改画布大小 1.44修改图像大小 1.5框选工具 1.6矩形工具 1.7图层 1.71图层颜色修改 1.72…...

c语言常用易错记录

c语言常用易错记录 文章目录 c语言常用易错记录1.for循环 1.for循环 示例&#xff1a; #include <stdio.h>int main() {int i;for (i 0; i < 10; i) {printf("%d\n", i);}return 0; }执行顺序 备注&#xff1a;此图来源于b站鹏哥C语言视频课截图&#xf…...

制造业ERP五大生产模式详解!

制造业面临着从成本控制、生产效率到供应链管理的挑战&#xff0c;每一个环节都需要精细化的管理和高效的协同。而ERP系统&#xff0c;作为一种集信息技术与管理思想于一体的管理工具&#xff0c;正逐渐成为制造业转型升级的关键。那么&#xff0c;通过本文你将会了解到&#x…...

​Python20 Numpy基础

NumPy&#xff08;Numerical Python&#xff09;是一个开源的Python库&#xff0c;广泛用于科学计算。它提供了一个高性能的多维数组对象&#xff0c;以及用于处理这些数组的工具和函数。NumPy是数据分析、机器学习、工程和科学研究中不可或缺的工具之一&#xff0c;因为它提供…...

暴雨虐长沙,生灵受煎熬

今天&#xff0c;“湖南长沙市遭遇强降雨,一小时的降雨量足够注满54个西湖”这消息&#xff0c;终于登上互联网社交平台热搜榜。 截图&#xff1a;来源社交网站 综合多家媒体消息概述如下。 昨&#xff08;24日&#xff09;天&#xff0c;湖南长沙市遭遇强降雨&#xff0c;一…...

iptables(5)常用扩展模块iprange、string、time、connlimit、limit

简介 之前我们已经介绍过扩展模块的简单使用,比如使用-m tcp/udp ,-m multiport参数通过--dports,--sports可以设置连续和非连续的端口范围。那么我们如何匹配其他的一些参数呢,比如源地址范围,目的地址范围,时间范围等,这就是我们这篇文章介绍的内容。 iprange扩展模块…...

Mars3d实现汽车尾气粒子效果从汽车屁股开始发射效果

本身的汽车尾气粒子效果&#xff1a;在汽车模型的中间发射的↓↓↓↓↓↓↓↓↓↓↓ Mars3d实例中是使用transY偏移值实现汽车尾气粒子效果从汽车屁股开始发射效果&#xff1a; // 动态运行车辆的尾气粒子效果 function addDemoGraphic4(graphicLayer) {const fixedRoute new…...

01_RISC-V 入门及指令集学习

参考文档 risc-v入门&#xff1a;https://blog.csdn.net/bebebug/article/details/128039038RISC-V OS&#xff1a;https://blog.csdn.net/bebebug/article/details/130551378riscv-spec文档&#xff1a;https://riscv.org/wp-content/uploads/2019/12/riscv-spec-20191213.pd…...

Facebook与地方文化:数字平台的多元表达

在当今数字化时代&#xff0c;社交媒体不仅仅是人们交流的工具&#xff0c;更是促进地方文化传播和表达的重要平台。作为全球最大的社交网络之一&#xff0c;Facebook在连接世界各地用户的同时&#xff0c;也成为了地方文化多元表达的重要舞台。本文将深入探讨Facebook如何通过…...

ArmSoM-Sige7/5/1 和树莓派5规格比较

引言 在当今快速发展的嵌入式系统领域&#xff0c;选择一款性能强大、功能丰富的开发板对于项目的成功至关重要。本文将介绍并比较 Sige7、Sige5、Raspberry Pi 5 和 Sige1 这四款开发板的关键规格和特性&#xff0c;帮助开发者和爱好者选择最适合其需求的平台。 ArmSoM-Sige…...

创建App

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Django项目中&#xff0c;推荐使用App来完成不同模块的任务&#xff0c;通过执行如下命令可以启用一个应用程序。 python manage.py startapp app…...

2024年6月上半月30篇大语言模型的论文推荐

大语言模型&#xff08;LLMs&#xff09;在近年来取得了快速发展。本文总结了2024年6月上半月发布的一些最重要的LLM论文&#xff0c;可以让你及时了解最新进展。 LLM进展与基准测试 1、WildBench: Benchmarking LLMs with Challenging Tasks from Real Users in the Wild Wi…...

Chromium下载

https://chromium.woolyss.com/download/ https://www.chromium.org/getting-involved/download-chromium/...

【Linux】彻底理解---环境变量(什么是环境变量,环境变量有什么作用?)

目录 一、前言 二、什么是环境变量&#xff1f; 三、如何添加环境变量&#xff1f; 四、如何获取环境变量&#xff1f; &#x1f4a7;环境变量相关的命令&#x1f4a7; &#x1f4a7;测试HOME与USER&#x1f4a7; &#x1f525;环境变量的获取方式&#x1f525; ① en…...

VMware完美安装Ubuntu20.04

一、官网下载Ubuntu20.04 下载地址为&#xff1a;https://releases.ubuntu.com/https://releases.ubuntu.com/ 下载完后镜像为ubuntu-20.04.4-desktop-amd64.iso 二、Ubuntu安装 2.1、打开VMware player&#xff0c;并创建新虚拟机。 2.2、点击浏览按钮选择需要安装的镜像 2…...

使用Spring Boot作为CMS系统的后台,Nuxt.js作为前台的分析

在现代Web开发中&#xff0c;前后端分离架构越来越受欢迎。Spring Boot和Nuxt.js的组合为构建内容管理系统&#xff08;CMS&#xff09;提供了一个强大的解决方案。本文将分析这种组合的优势、挑战以及应用场景。 1. 技术概述 1.1 Spring Boot Spring Boot是基于Java的框架&…...

Spring Boot整合Druid:轻松实现SQL监控和数据库密码加密

文章目录 1 引言1.1 简介1.2 Druid的功能1.3 竞品对比 2 准备工作2.1 项目环境 3 集成Druid3.1 添加依赖3.2 配置Druid3.3 编写测试类测试3.4 访问控制台3.5 测试SQL监控3.6 数据库密码加密3.6.1 执行命令加密数据库密码3.6.2 配置参数3.6.3 测试 4 总结 1 引言 1.1 简介 Dru…...

推荐一款好用的编辑工具——onlyoffice桌面编辑器8.1

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 &#x1f525;前言&#x1f680;版本更新概览&#x1f697;文档编辑PDF编辑器…...

C++ | Leetcode C++题解之第188题买卖股票的最佳时机IV

题目&#xff1a; 题解&#xff1a; class Solution { public:int maxProfit(int k, vector<int>& prices) {if (prices.empty()) {return 0;}int n prices.size();k min(k, n / 2);vector<int> buy(k 1);vector<int> sell(k 1);buy[0] -prices[0]…...

操作系统实训复习笔记(2)

目录 Linux操作系统&#xff08;认识记忆&#xff09; &#xff08;1&#xff09;Linux 文件系统是树形层次结构 &#xff08;2&#xff09;Linux 用户介绍 &#xff08;3&#xff09;Linux 常用命令介绍 &#xff08;4&#xff09;ls命令 &#xff08;5&#xff09;Linu…...

北邮《计算机网络》英文选择题课堂小测

课堂小测验及答疑汇总 2020年 5 月 12 日 Q1. Which is the network address after aggregation of following 3 networks: 200.2.50.0/23&#xff0c; 200.2.52.0/22 and 200.2.56.0/22? A. 200.2.48.0/20 B. 200.2.50.0/20 C. 200.2.48.0/21 D. 200.2.50.0/21 Answer: A Q…...

kafka 集群安全认证机制的设计实现

kafka 集群安全认证机制的实现 Kafka 提供了多种安全认证机制来保护数据传输的安全性,包括加密、身份认证和授权。这些机制确保 了 Kafka 集群的通信安全和数据访问控制。以下是 Kafka 安全认证机制的实现和配置指南。 1. 安全认证机制概述 Kafka 支持以下几种主要的安全机…...

pandas保存成CSV格式时数据换行:SQL的REPLACE函数过滤掉数据的回车符

在使用Pandas保存数据到CSV文件时&#xff0c;如果数据中包含换行符&#xff08;例如\n&#xff09;&#xff0c;这可能会导致数据在CSV文件中被分割成多行&#xff0c;影响数据的完整性和可读性。为了解决这个问题&#xff0c;你可以在保存CSV之前使用Pandas的replace函数来替…...