七、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,后跟函数名称和一对圆括号。在圆括号内,可以指定任意数量的参数…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
