【QT入门】 Qt实现自定义信号

往期回顾:

【QT入门】图片查看软件(优化)-CSDN博客

【QT入门】 lambda表达式(函数)详解-CSDN博客

【QT入门】 Qt槽函数五种常用写法介绍-CSDN博客

 【QT入门】 Qt实现自定义信号

一、为什么需要自定义信号

比如说现在一个小需求,我们想要实现跨ui通信,通俗来说,就是两个ui界面,点击一个ui界面的按钮,让另一个ui界面数据变化。此时我们就要自定义信号和槽来实现。

二、自定义步骤

1、创建两个ui界面,每个ui界面创建一个按钮,并绑定相应的槽函数

这一步相对来说很简单的,其中注意一个点,我们如何在原本项目基础上再创建一个ui:

右键单击项目,选择Add New->Qt->Qt设计师界面类即可

2.实现原界面按钮,出现另一个ui界面 

这一步同样简单,只需要在原界面按钮槽函数里创建另一个ui界面对象即可

void  Widget::on_btnOpen_clicked()
{SetDialog dig;dig.exec();//事件循环
}

当用户点击btnOpen按钮时,会触发on_btnOpen_clicked()槽函数。在该槽函数中,创建了一个SetDialog对象dig并调用exec()函数来显示对话框。这样做会弹出另一个界面,因为SetDialog类是一个对话框类,通过调用exec()函数来显示对话框界面,从而实现弹出另一个界面的效果。 

3.第三步,也是最重要的一步,点击弹出的ui界面按钮,实现原界面数据变化 

首先需要在弹出ui界面定义一个信号函数,当点击此界面ui时执行该信号函数,也就是发送信号,

void  SetDialog::on_btnAdd_clicked()
{static  int value=100;emit on_AddOne_clicked(value++);
} 

emit是一个关键字,用于发射(emit)信号。

由于信号的接收方为原ui界面,收到信号后显示数据,所以connect的四个参数明确 

    connect(&dig,&SetDialog::on_AddOne_clicked,[=](int value){//用QString的number方法把int类型数据转为QStringui->lineEdit->setText(QString::number(value));});

这里因为传递的信号有参数,需要把参数带上,虽说lambda表达式的形参数可以小于等于实际参数数,但是我不写报错了,所以建议大家还是写上。

四个参数一一看:分别是

1、信号的发送者:弹出ui界面对象dig
2、发送的信号:执行数据改变的信号函数
3、信号的接收者:原ui界面
4、信号的处理:显示数据在lineEdit上

大家对信号和槽机制多理解,在Qt框架中,信号和槽机制是一种用于在不同对象之间进行通信的机制。当某个事件发生时,一个对象可以发射一个信号,而其他对象可以连接到这个信号并执行相应的槽函数,就是某个事件发生会发射一个信号,其他对象可以连接到这个信号,一旦捕获到这个信号就执行相应得操作(槽函数),这样使得不同对象之间通信及其方便。

最终的代码:

void  Widget::on_btnOpen_clicked()
{SetDialog dig;connect(&dig,&SetDialog::on_AddOne_clicked,[=](int value){ui->lineEdit->setText(QString::number(value));});dig.exec();
}

调用exec()函数显示窗口,会导致进入事件循环,会阻塞UI,直到对话框关闭为止。
这意味着程序会等待用户对对话框的操作完成后,才会继续执行后面的代码。所以connect必须放在exec()方法执行前面。

我们这里的信号槽是用lambda表达式写的,想一下,如果不用,又该怎么写:

void Widget::on_btnOpen_clicked()
{setDialog dig;connect(&dig,&setDialog::on_AddOne_clicked,this,&Widget::lineAdd);dig.exec();
}

所以为什么说用lambda表达式在槽函数代码量少得情况下很好,因为避免了再去写槽函数这个环节,我不用lambda表达式,我就要自己再写一个槽函数,把实现代码写槽函数里面。

至此,我们就实现了一个简单的自定义信号。


都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/766138.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

优化选址问题 | 基于鹈鹕算法求解基站选址问题含Matlab源码

目录 问题代码问题 鹈鹕算法(Pelican Optimization Algorithm, POA)是一种相对较新的启发式优化算法,模拟了鹈鹕鸟觅食的行为。这种算法通常用于解决复杂的优化问题,如函数优化、路径规划、调度问题等。基站选址问题通常是一个复杂的优化问题,需要考虑覆盖范围、干扰、成…

阿里云ECS服务器u1通用算力型CPU性能如何?

阿里云服务器u1是通用算力型云服务器,CPU采用2.5 GHz主频的Intel(R) Xeon(R) Platinum处理器,通用算力型u1云服务器不适用于游戏和高频交易等需要极致性能的应用场景及对业务性能一致性有强诉求的应用场景(比如业务HA场景主备机需要性能一致)&#xff0c…

LAMP架构与搭建论坛

目录 1、LAMP架构简述 2、各组件作用 3、构建LAMP平台 3.1编译安装Apache httpd服务 3.1.1关闭防火墙,将安装Apache所需软件包传到/opt目录下 3.1.2安装环境依赖包 3.1.3配置 设置安装目录、安装模块 3.1.4编译安装 3.1.5优化配置文件路径 3.1.6启动apache…

北航计算机软件技术基础课程作业笔记【1】

为白成刚老师的课程&#xff0c;简单做一个记录&#xff0c;内容偏基础&#xff0c;自己仅保留认为有用的部分 L1&#xff1a;算法概论 课程简单介绍了复杂度、算法的概念 1.作业 计算下列各片断程序中xx1的执行次数 (1) for (i1; i<n; i)for (j1; i<n; j)for (k1; …

牛客小白月赛89补题1(ABCD)(偏难)

评价&#xff1a; 高情商&#xff1a;收获很大 &#xff0c;让自己进一步认清自己。 低情商&#xff1a;题目难&#xff0c;自己太菜了。 今天还有一些其他事&#xff0c;剩下的题明天再补。 我们从a题开始吧&#xff1a; A.签到 我们只要看看其中的max与min是否不符合即可…

Android14之selinux报错:ERROR: end of file in comment(一百九十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

项目成功秘诀:高效管理策略确保按时交付v2

一、项目成功的重要性 在当今竞争激烈的商业环境中&#xff0c;项目的成功对于企业的生存和发展具有至关重要的意义。项目的成功不仅意味着企业能够达成既定的业务目标&#xff0c;还能提升企业的市场地位、增强品牌影响力&#xff0c;并为企业的可持续发展奠定坚实基础。我们…

中型企业网络路由器配置(ensp)实验

vlan、vlan间路由、ospf协议等来实现三层交换机和单臂路由之间的通信 拓扑图&#xff1a; 1. 配置三层交换机vlan和vlan间路由 SW1 #进入视图 sys sysn sw1 undo info-center enable#配置vlan vlan batch 10 20 30 40 50 60#配置access口 int g0/0/1 port link-type access …

视觉信息处理和FPGA实现第6次作业-Matlab实现灰度图像的亮度调节

一、代码 close all;clear all;clc; pic imread("cameraman.tif"); [M,N] size(pic); disp("Contrast Ajust Demo"); value input("Please input number of value, range: 0~2\n"); while value>2 || value<0disp("The number is in…

python--for循环

for循环&#xff1a; python中的for循环是用来迭代容器中的每一个元素的&#xff0c;而不是c,java中理解那个循环&#xff1b; for 零时变量 in 容器&#xff1a; print&#xff08;零时变量&#xff09; #每一个迭代出的元素 range 全局函数&#xff1a; …

P6技巧:修改P6 Professional标题/标签名称/字体

前言 P6 Professional作为P6的客户端工具其本身具有一定的改造属性&#xff0c;通过修改其安装程序文件&#xff0c;可以实现对部分功能菜单/标签文字名称的修改/重定义 如以下标识的信息&#xff0c;都可对齐改名 方法 以下介绍的方法只可对本机有效&#xff0c;这里已修改…

开学考核复现

不要尝试爆破哟!(misc) 下载图片&#xff0c;解析图片 拿到密码&#xff0c;解压压缩包&#xff0c;生成图片 扫描二维码 留个后门(misc) D盾扫描 打开文件寻找 师姐的旅游照片(misc) 随波逐流&#xff0c;然后base64解码 修改后缀为zip&#xff0c;解压 修改高度 Fuck! (C…

Matlab之已知2点绘制长度可定义的射线

目的&#xff1a;在笛卡尔坐标系中&#xff0c;已知两个点的位置&#xff0c;绘制过这两点的射线。同时射线的长度可以自定义。 一、函数的参数说明 输入参数&#xff1a; PointA&#xff1a;射线的起点&#xff1b; PointB&#xff1a;射线过的零一点&#xff1b; Length&…

Redis入门到实战-第四弹Strings 篇

Redis实战热身Strings 篇 完整命令参考官网 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的&#xff08;采用BSD许可证&#xff09;&#xff0c;用作数据库、缓存、消息代理…

【Android】【Bluetooth Stack】蓝牙音乐协议分析之A2DP和AVRCP连接流程(超详细)

1. 精讲蓝牙协议栈(Bluetooth Stack):SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OPP/PAN/GATTC/GATTS/HOGP等协议理论 2. 欢迎大家关注和订阅,【蓝牙协议栈】和【Android Bluetooth Stack】专栏会持续更新中.....敬请期待! 1. 协议架构 上面描述的就是整体的协议架构,我们针…

基于springboot+vue的物资仓储物流管理系统(源码+论文)

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

Linux线程补充1

十、多线程中线程间的"独立" ​ 1.线程在代码段通过执行不同的函数&#xff0c;实现代码段的独立&#xff1b; ​ 2.新线程通过在共享区划分不同的管理属性和不同的栈空间&#xff0c;实现栈的独立&#xff0c;而主线程使用的是栈空间&#xff1b; ​ 3.线程通过获…

2 Spring之IOC详解

文章目录 4&#xff0c;IOC相关内容4.1 bean基础配置4.1.1 bean基础配置(id与class)4.1.2 bean的name属性步骤1&#xff1a;配置别名步骤2:根据名称容器中获取bean对象步骤3:运行程序 4.1.3 bean作用范围scope配置4.1.3.1 验证IOC容器中对象是否为单例验证思路具体实现 4.1.3.2…

计算平均分 javascript

养成好习惯&#xff1a;先写注释再写代码 基础版&#xff1a;直接写逻辑&#xff08;平均分总和/个数&#xff09; // 求平均分 var scores [60, 55, 80, 33, 75, 100]; // 求和,相除 var sum 0; var avg;for (var i 0; i < 6; i) {sum scores[i]; }avg sum / 6; con…