七、Qt 信号和槽
在QT4以上的版本,在窗体上用可以通过选中控件,然后点击鼠标右键单击按钮,选择“转到槽”。可以自动创建信号和槽。

选择clicked(),并点击 ok

Qt Creator会给头文件和代码文件自动添加 这个按钮的单击事件(信号和槽)。

不同的控件,信号不全是一样的,根据控件的使用场景不同,包含的信号也不一样。比如下拉列表框的信号和按钮的不太一样,没有按钮的单击信号,只有选择信号

以上是用QT新版本的特性来创建信号和槽。比较方便。
下边我们来介绍自定义信号和槽的绑定。首先介绍connect函数:
connect(信号发送者对象, 信号, 信号接收者对象, 槽, 信号和槽之间的连接模式)
connect函数有5个参数,其中第五个参数为信号和槽的连接模式,此参数有默认模式=AutoConnection。
enum ConnectionType {
AutoConnection,
DirectConnection,
QueuedConnection,
BlockingQueuedConnection,
UniqueConnection = 0x80
};
AutoConnection:自动连接,默认模式。连接类型会在信号发送时决定。如果接收者和发送者在同一个线程,则自动使用Qt::DirectConnection类型;如果接收者和发送者不在一个线程,则自动使用Qt::QueuedConnection类型。 DirectConnection:直接连接,槽函数会在信号发送的时候直接被调用,槽函数和信号发送者在同一线程。效果看上去就像是在发送信号的位置调用了槽函数。无论槽函数所属对象在哪个线程,槽函数都在发射信号的线程内执行。 emit语句后面的代码将在与信号关联的所有槽函数执行完毕后才被执行。 QueuedConnection:队列连接,信号发出后会暂时被放到一个消息队列中,需等到接收对象所属线程的事件循环取得控制权时才取得该信号,然后执行和信号关联的槽函数,这种方式既可以在同一线程内传递消息也可以跨线程操作。 emit语句后的代码将在发出信号后立即被执行,无需等待槽函数执行完毕,槽函数在接收者所依附线程内执行。 BlockingQueuedConnection:槽函数的调用时机与Qt::QueuedConnection一致,区别在于发送者emit完信号后所在线程会阻塞,直到槽函数运行完毕。并且接收者和发送者绝对不能在一个线程,否则程序会死锁。在多线程间需要同步的场合可能需要这个。 Qt::UniqueConnection:这个flag可以通过按位或(|)与以上四个结合在一起使用。当这个flag设置时,当某个信号和槽已经连接时,再进行重复的连接就会失败。也就是为了避免重复连接。
以下拉列表框控件QCombobox举例,当下拉选项改变时,会触发相关的槽:
// QT4 信号和槽最常用也是最常见的连接方式为使用:
connect(ui->comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(currentIndexChanged(int))); connect(ui->comboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(currentIndexChanged(QString)));
以上代码需要写到窗体的构造函数里

然后需要在头文件中声明
currentIndexChanged(int index)
currentIndexChanged(QString text)

然后在代码文件中实现这两个函数

以上的写法是在Qt4中,使用SIGNAL和SLOT这两个宏,将信号和槽转成了字符串形式,是利用的字符串进行的匹配。如果信号和槽不匹配,编译工程时是不会报错的!
在Qt5版本中对信号和槽采用了新的方法:基于函数地址的强制类型转换或重载,如果信号和槽的形参不匹配,在编译时就会报错:
connect(ui->comboBox, QOverload::of(&QComboBox::currentIndexChanged), this, [=](int index){
QMessageBox::information(this, "index", QString::number(index));
});
connect(ui->comboBox, &QComboBox::currentTextChanged, this, [=](const QString &text){
QMessageBox::information(this, "text", text);
});

上边的定法中[]有以下三种用法,说明如下:
[] 空的捕获列表,不会捕获任何外部变更,也不能访问任何外部变量
connect(button,&QPushButton::clicked,[](){
qDebug()
});
[=] 拷贝,外部变量以值传递,不能修改外部变量的值
int nCount = 0;
[=] 所有 [nCount] [=nCount]
[&]引用,可以修改外部变量的值
int nCount = 0;
connect(button,&QPushButton::clicked,[&](){ //也可以写成[&nCount]
nCount ++;
qDebug()
});
QOverload是QT5.7版本之后才加入的,
语法格式:QOverload::of(函数地址)
作用:返回指定参数的重载函数。
QT5中的信号和槽的连接使用模板:
connect(
发送者对象,
static_cast(&发送者类名::信号函数名),
this,
static_cast(&接收者类名::槽函数名)
);
或
connect(
发送者对象,
qOverload::of(&发送者类名::信号),
this,
qOverload::of(&接收者类名::槽)
);
QObject::connect(m_test, QOverload::of(&FunctionTest::valueChangedflag),m_data, &Dataprocess::SignalOutputFlag);
这行代码是用于在Qt中建立信号与槽的连接。信号valueChangedflag来自FunctionTest对象,它的参数类型是QString和bool。槽SignalOutputFlag来自Dataprocess对象。当valueChangedflag信号被触发时,会调用SignalOutputFlag槽函数。
该连接的作用是将FunctionTest的信号与Dataprocess的槽函数进行关联,以便在valueChangedflag信号触发时,通过调用SignalOutputFlag槽函数来处理相关逻辑。
请注意,根据代码上下文和实际需求,m_test和m_data应该是对象的指针或引用。此外,确保在连接信号与槽之前,FunctionTest和Dataprocess类都已正确定义和声明。
QOverload::of(&FunctionTest::valueChangedflag) 是一个用于获取成员函数指针的静态函数模板。
在这里,QOverload 是一个模板类,提供了多个静态成员函数 of,用于获取特定参数签名的成员函数指针。QString 和 bool 是参数类型。FunctionTest::valueChangedflag 是一个信号函数,它将被连接到槽函数。
通过使用 QOverload::of(&FunctionTest::valueChangedflag),可以在连接信号和槽时指定正确的参数类型,并确保信号函数与槽函数的参数匹配。
请注意, QOverload 类是 Qt 提供的用于信号和槽连接的辅助类,它提供了一种类型安全的方法来处理函数指针的重载问题。它允许在连接信号和槽时检查参数类型的一致性,以避免潜在的编译错误和运行时错误。
connect(comboBox, QOverload::of(&QComboBox::currentIndexChanged),[=](int index){
/* do ... */
});
《写在最前边》
《一、QT的前世今生》
《二、QT下载、安装及问题解决(windows系统)》
《三、Qt Creator使用》
《四、Qt 的第一个demo-CSDN博客》
《五、带登录窗体的demo》
《六、新建窗体时,几种窗体的区别》
《七、Qt 信号和槽》
相关文章:
七、Qt 信号和槽
在QT4以上的版本,在窗体上用可以通过选中控件,然后点击鼠标右键单击按钮,选择“转到槽”。可以自动创建信号和槽。 选择clicked(),并点击 ok Qt Creator会给头文件和代码文件自动添加 这个按钮的单击事件(信号和槽)。 …...
C盘满了,我用什么思路清理?
20240115 上周六同事传了一个很大的虚拟机给我,C盘就红了 虽然是飞秋选错了存储文件的路径,但后来忘了,就开始毫无目的删除文件,过程中会有没有权限删除的,这样还是没有改善。 咨询了公司IT技术人员, 告…...
Simulink简介
Simulink 是一个模块图环境,用于多域仿真以及基于模型的设计。它支持系统级设计、仿真、自动代码生成以及嵌入式系统的连续测试和验证。Simulink 提供图形编辑器、可自定义的模块库以及求解器,能够进行动态系统建模和仿真。Simulink 与 MATLAB 相集成&am…...
学习Vue封装的过渡与动画总结
今天学习了Vue封装的过渡与动画,接下来说一下Vue是如何实现的,首先原生的方法是在style元素中给指定元素添加过渡的过渡或动画,但Vue就不需要直接获取到需要过渡或动画的元素,而是使用一个<transition>的标签来包裹住想要过…...
vue2 pdfjs-2.8.335-dist pdf文件在线预览功能
1、首先先将 pdfjs-2.8.335-dist 文件夹从网上搜索下载,复制到public文件夹下. 2、在components下新建组件PdfViewer.vue文件 3、在el-upload 中调用 pdf-viewer 组件 4、在el-upload 中的 on-preview方法中加上对应的src路径 internalPreview(file) { //判断需要…...
messages,CentOS 7不收集日志或不存在 /var/log/messages
/var/log/message, /var/log/secure等都不记录了,并且都是空文件。 重启机器:reboot 无效 重启日志: systemctl start rsyslog 无效 怀疑空间不足,删除/var/log/messages,重新运行rsyslog 无效 重装下rsyslog,于是…...
Express安装与基础使用
一、express 介绍 express 是一个基于 Node.js 平台的极简、灵活的 WEB 应用开发框架, 官方网站: Express - 基于 Node.js 平台的 web 应用开发框架 - Express中文文档 | Express中文网 中文文档: 路由 - Express 中文文档 简单来说&am…...
vue2使用electron以及打包配置
1.创建项目 vue create vue-project 2.安装electron vue add electron-builder会自动安装相关依赖 安装成功后会在src下自动生成一个background.js文件就是相应的electron的配置信息 use strictimport { app, protocol, BrowserWindow } from electron import { createProto…...
科研绘图(五)玫瑰图
柱状图的高级平替可视化 “玫瑰图”,通常也被称为“科克斯图”。它类似于饼图,但不同之处在于每个部分(或“花瓣”)的角度相同,半径根据它表示的值而变化。这种可视化工具对于周期性地显示信息非常有用,比…...
SQL Server 数据类型
文章目录 一、文本类型(字母、符号或数字字符的组合)二、整数类型三、精确数字类型四、近似数字(浮点)类型五、日期类型六、货币类型七、位类型八、二进制类型 一、文本类型(字母、符号或数字字符的组合) 在…...
【.NET Core】C#预处理器指令
【.NET Core】C#预处理器指令 文章目录 【.NET Core】C#预处理器指令一、概述二、可为空上下文(#nullable)三、条件编译2.1 定义DEBUG是编译代码2.2 未定义MYTEST时,将编译以下代码 四、定义符号五、定义区域六、错误和警告信息 一、概述 预…...
自定义类型详解(2)
文章目录 5. 通讯录的实现 5. 通讯录的实现 实现一个通讯录: 通讯录中保存人的信息: 名字年龄性别电话住址 通讯录中可以存放100个人的信息增加联系人删除指定联系人修改指定联系人查找指定联系人显示所有联系人的信息排序功能 首先,我们需要…...
Python 网络爬虫入门详解
什么是网络爬虫 网络爬虫又称网络蜘蛛,是指按照某种规则在网络上爬取所需内容的脚本程序。众所周知,每个网页通常包含其他网页的入口,网络爬虫则通过一个网址依次进入其他网址获取所需内容。 优先申明:我们使用的python编译环境为PyCharm 一、首先一个网络爬虫的组成结构…...
记一次 .NET某收银软件 非托管泄露分析
一:背景 1. 讲故事 在我的分析之旅中,遇到过很多程序的故障和杀毒软件扯上了关系,有杀毒软件导致的程序卡死,有杀毒软件导致的程序崩溃,这一篇又出现了一个杀毒软件导致的程序非托管内存泄露,真的是分析多…...
C++力扣题目131--分割回文串
131. 分割回文串 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 示例 1: 输入:s "aab" 输出:[["a&qu…...
vue脚手架
● vue是单⻚⾯应⽤程序 ● 什么是路由 ○ 后端路由 ■ 对于普通的⽹站,所有的超链接都是URL地址,所有的URL地址都对应服务器上对应的资源 ○ 前端路由 ■ 对于单⻚⾯应⽤程序来说,主要通过URL中的hash ( # 号) 来实现不同⻚⾯之间的切换…...
Monorepo-uniapp 构建分享
Monorepo uniapp 构建灵感:刚好要做一个项目,于是想到升级一下之前自己写的一个vue3tspiniauno的模版框架,其实那个框架也不错;只是感觉还差点东西,我已经用那个小框架写了两三个项目;轻巧实用。为什么选…...
django后台登录:Forbidden (403) CSRF verification failed. Request aborted.
如果您在尝试登录Django后台时遇到了CSRF验证失败的错误,这通常意味着您的浏览器未能提交正确的CSRF令牌,或者Django后端未能验证该令牌。遵循以下步骤来解决这个问题: 清除浏览器Cookies和缓存: 有时候,浏览器的Cooki…...
【Python数据可视化】matplotlib之绘制常用图形:折线图、柱状图(条形图)、饼图和直方图
文章传送门 Python 数据可视化matplotlib之绘制常用图形:折线图、柱状图(条形图)、饼图和直方图matplotlib之设置坐标:添加坐标轴名字、设置坐标范围、设置主次刻度、坐标轴文字旋转并标出坐标值matplotlib之增加图形内容&#x…...
Python从入门到精通秘籍五
Python速成,每日持续更新,知识点超详细,涵盖所有Python重难点知识及其对应代码,利用碎片化时间,实现Python从入门到精通的飞跃!!! 一、Python的函数基本定义语法 当定义一个函数时,我们使用关键字def,后跟函数名称和一对圆括号。在圆括号内,可以指定任意数量的参数…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
