Qt信号与槽的链接3种方法详解

2023-11-19

转载自:(14条消息) Qt5.9.2+VS2017入门实例——透彻解析_冯爽朗的博客-CSDN博客_vs qt 示例

由于现在书上介绍的大部分都是Qt Creator,并没有介绍Qt+VS的教程,虽然说很相似,但是也有很多地方不同,对于初学者特别是那些槽和信号的连接非常的乱,而且几种文件也傻傻分不清,这个实例就带你理清Qt+VS的创作过程,保证你可以举一反三,会用一些简单控件的添加与事件的触发。

在完成例子之前我先说一下,本例子是用Qt设计师设计界面,不像其他地方直接用代码实现界面的设计。

              

案例说明:

         1.勾选CheckBox可以改变LineEdit里面的文字属性,是只读还是加密显示。

         2.点击输入按钮可以将LinEdit里面的文字显示在TextLabel里面。

首先创建新的项目如下图:

 这里先简单介绍下解决方案中的文件:

(1)是Qt设计师文件,双击可以打开Qt可视化设计

(2)Qt界面的代码文件,Qt设计师设计的界面以代码的形式存储在这里,比如Button的位置,大小,名字

(3)Widget类的头文件,定义一些字段和函数声明,包括最重要的slots(槽)函数的声明,以及界面ui句柄,以便通过“ui.***”的方式访问到界面的各个控件,比如访问界面的Label控件里的文字可以这样:ui.label->text();就是字面意思,很容易理解。

(4)资源文件,相当于AndroidStudio里面的rcs文件夹,里面存放需要用到的.ico图标或者图片。

(5)主函数文件,程序的入口,不必解释,其实一般不会在这个里面修改什么。

(6)Widget类完成的主要文件,在widget.h里面定义之后的字段以及函数声明,以及槽的实现,都是在这里,Qt的逻辑功能设计主要是修改这个文件。

然后设计界面——拖放控件:

双击.ui文件,打开Qt设计师,在设计师的左边控件区域找到下面几个控件:

1. Check Box(2个)

2.PushButon

3. LineEdit

4.TextLabel

左键按下拖动到界面上,布局如图所示,双击界面上的控件,改变他们显示的名字,(控件有两个名字:1,显示时的名字(text),2,设计时需要调用它时的名字(objectName),一般是英文和数字组合。

现在开始本篇博客的重头戏,信号与槽的链接。

1、先添加事件发现的函数——槽函数。

因为我们有三个动作(事件),其中有一个是按钮按下的动作(事件),还有两个分别是两个CheckBox勾选后的动作(事件),这些动作发生之后都要执行相对应的任务。所以先添加这些事件函数,slots是槽的意思,在widget.h文件中添加。

#pragma once
 
#include <QtWidgets/QWidget>
#include "ui_widget.h"
 
class Widget : public QWidget
{
	Q_OBJECT
 
public:
	Widget(QWidget *parent = Q_NULLPTR);
 
private:
	Ui::WidgetClass ui;
private slots:
	void on_checkBox_clicked();
	void on_checkBox_2_clicked();
}

需要注意的是这些函数是有命名规则的,"on_"后面是控件的设计名字(objectName),然后后面是“_clicked()”,你在设计的时候最好遵循这种命名格式,这样你就可以省掉2的步骤(连接信号与槽),也就是说,你如果遵循这个命名格式的话你就不用写connect()函数了,因为这种定义让系统能够自动识别信号与槽的连接,不用再写connect()函数,可以直接到第3步(槽函数的实现),但是如果系统比较复杂,并不是所有的都可以这样命名的时候,你就要用到2的步骤了。

2、连接信号与槽

如果你在1中没有按照命名规则来命名槽函数,那么就要进行信号与槽的连接,所谓信号与槽的连接就是,一个事件触发会发送出一个信号,要有一个相应的槽接收这个信号,然后执行相应任务。这个过程需要连接的,如果不设计这个连接,即使事件触发,Button send出一个click信号,也没有什么东西去执行click后的任务。

那么怎么进行连接呢,在widget.cpp里添加:
 

#include "widget.h"
 
Widget::Widget(QWidget *parent)
	: QWidget(parent)
{
	ui.setupUi(this);
	connect(ui.checkBox,SIGNAL(clicked()),this,SLOT(on_checkBox_clicked()));
	connect(ui.checkBox_2, SIGNAL(clicked()), this, SLOT(on_checkBox_2_clicked()));
	connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(on_pushButton_clicked()));
}

可以很容易看出,ui中的checkBox发出一个clicked()的信号,on_checkBox_clicked()槽函数去接收它,在这里我用的是正规的命名规则,其实是不需要写connect()函数的,这里使用connect函数是进行示范用。

必杀技:

必杀技终于来了,有没有感觉这样手动写connect()函数很蛋疼,写完一个槽函数也就算了,还要我自己写信号与槽的连接,如果多的话,我岂不一个个写要累死,所以用到Qt设计师的时候到了:

双击widget.ui文件打开设计师,如下步骤进行:

 如上图,点击1处的信号与槽按钮,然后先为“只读”checkbox添加信号与槽的连接,方法就是鼠标左键拖动“只读”按钮到空白区域,松开鼠标会弹出信号与槽的对话框,如下图:

如上图:首先选择2处的信号(clicked(),对应步骤2的手动写connect()就可以明白),然后点击3处的编辑以便添加槽,如下图: 

如上图:点击1处的加号,会在2处出现slot1(),这个是默认的,所以把slot1()改成你自己需要的槽,“只读”check Box对应的槽应该是on_checkBox_clicked(),(注意这里我用的也是正规命名规则,正规命名规则是不需要添加槽和信号的连接的,我这里只是做示范用),添加之后点击下面的ok,然后进行下一步:

 

如上图:你就完成了一个复选框的信号与槽的连接了,clicked()是信号,on_checkBox_clicked()是槽,接下来按照同样的方法进行其他两个控件的信号与槽的连接就可以了。 

3、widegt.cpp的修改——槽函数的任务执行

无论你是利用哪一种方式连接信号与槽的,都需要看这一步,这一步也是最重要的一步,也就是点击按钮之后,功能的实现,现在只剩下如何完成点击之后的功能了,所以要补全槽函数的内部,你要知道,我们在4.1中添加的槽函数是在widget.h这个头文件中添加的,这个叫做声明,所有我们要补全它,当然是在其对应的widget.cpp文件中补全,可能会遇到一些问题,请参考下面的“补充”解决,代码如下:
 

#include "widget.h"
 
Widget::Widget(QWidget *parent)
	: QWidget(parent)
{
	ui.setupUi(this);
	
}
void Widget::on_checkBox_clicked()
{
	if (ui.checkBox->isChecked())
	{
		ui.lineEdit->setReadOnly(true);
	}
	else
	{
		ui.lineEdit->setReadOnly(false);
	}
}
void Widget::on_checkBox_2_clicked()
{
	if (ui.checkBox_2->isChecked())
	{
		ui.lineEdit->setEchoMode(QLineEdit::Password);
	}
	else
	{
		ui.lineEdit->setEchoMode(QLineEdit::Normal);
	}
}
 
void Widget::on_pushButton_clicked()
{
	ui.label->setText(ui.lineEdit->text());
}

首先要包括widget.h这个头文件,因为这里用到的函数与句柄都是在widget.h里定义的,其中有一个ui句柄,就是在指整个界面,你可以通过这个ui访问界面上的控件(可能会出现ui_widget.h找不到或打不开问题,看下面的补充),解释一下第一个槽函数里的内容:

 ui.checkBox->isChecked():指的是ui界面上的checkBox控件被勾选,返回的是一个bool型,很容易理解,被勾选就是true,否则就是false.

然后看里面的ui.lineEdit->setReadOnly(true):ui界面上的lineEdit控件设置成只读属性,或者不是只读属性。就这么简单。

其实设计师中完成的信号与槽的连接也是通过代码实现的,只是我们通过设计师自己添加的时候,代码已经默默的生成connect()函数了,不信的话你可以到ui_widget.h文件里面找到retranslateUi(WidgetClass);看看下面的代码是不是connect()函数,哈哈,是的!

总结:

当一个事件触发时,会发出一个信号,信号与槽链接后,由相应的槽函数接收这个信号执行相应的动作。其中信号与槽的链接主要有3种方法,其一,按照规范命名,系统会自动进行链接,其二,在构造函数中利用connect函数进行链接,其三,利用Qt Desginer编辑信号与槽。因此,完成一个事件的触发要历经3个步骤,添加槽函数,链接信号与槽,实现槽函数。

补充:

          可能在你修改widget.cpp文件时就会发现ui_widget.h文件打不开,无法用到输入提示(比如你在widget.cpp文件中输出“ui.”的时候后面不会出现提示的单词,那是因为你的ui_widget.h文件没有被识别),你可以将ui_widget.h文件右键->移除,然后重新添加就可以了!
 

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

Qt信号与槽的链接3种方法详解 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • Qt 支持 Windows 蓝牙 API 吗?

    谁能告诉我 Qt 是否支持 Windows 蓝牙 API 如果是这样 您能否分享一些有关如何使用它的信息 自上次答复以来 这个问题的答案发生了一些变化 Qt 5 2 版为 Linux BlueZ 和 BlackBerry 设备实现了蓝牙 A
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri

随机推荐

  • Mybatis中insert中返回主键ID的方法

    1 XyzMapper xml
  • 深入学习jquery源码之addClass()和toggleClass()与hasClass()

    深入学习jquery源码之addClass 和toggleClass 与hasClass addClass class fn 概述 为每个匹配的元素添加指定的类名 参数 class String 一个或多个要添加到元素中的CSS类名 请用空
  • Python opencv学习-6Canny边缘检测学习

    代码 图片参考https blog csdn net tengfei461807914 article details 76376941 修正了其文中出现的错误 canny作用及用法简单理解 阈值针对的是图像灰度梯度而言 需要确定哪些边界是
  • dvwa靶场通关(十一)

    第十一关 Reflected Cross Site Scripting XSS low 这一关没有任何防护 直接输入弹窗 打开网页源代码 从源代码中我们可以看到 前面是输出的第一部分Hello 我们输入的脚本被成功解析执行 所以出现了弹窗
  • QLine设置为虚线点线双线改变颜色

    实线 solid 虚线dashed 点线dotted 双线double 1 双线 border top 3px double black 线高度设置为3才能看到效果 2 点线 border top 2px dotted black 线高度设
  • 从单片机初学者迈向单片机工程师(对初学者非常有用)

    cn www ourDev cn 1 从单片机初学者迈向单片机工程师 作者 tangwei039 来自 西安 tangwei039 126 com 整理 by Linff 目录 一 LED 主题讨论周第一章 写在前面 1 二 LED 主题讨
  • 使用伪类将el-switch文字放在内部

    前言 由于switch是放在table里的 如果文字放在外面 样式会比较不好看 如果单独写一个浪费造轮子 我们直接动态添加类名 应该可以实现类似的效果 所以就可以使用伪类进行添加文字 效果 源码
  • 【图像处理】相机、透镜、人眼、小孔成像原理

    相机成像原理 相机成像原理分为透镜成像原理和小孔成像原理 相机成像原理 现代相机有很多分类 且分类标准不统一 在这里简单分类为可更换镜头相机和不可更换镜头相机两种 对于可更换镜头而言 例如单反 单镜头反光照相机 镜头只是整个系统的一个部件
  • 3D游戏编程与设计-游戏的本质hw1

    游戏的本质 游戏的分类 游戏热点 华为市场的排行榜前20游戏排名情况如下 畅销榜 人气榜 热门榜 TapTap榜单前20游戏排名情况 热玩榜 热门榜 App Store付费游戏与免费游戏排名前20情况 热点分析 游戏的分类 游戏的分类标准很
  • 【回答问题】ChatGPT上线了!ChatGPT所有知识截止到了2021年!

    回答问题 ChatGPT上线了 ChatGPT所有知识截止到了2021年 因此2022年的一下技术性知识查不到 但不影响你使用它作为你的百度小助手 从上面可以看出 chatgpt还是有区分大小写的情况 例如 SLAM
  • 设计模式之享元模式

    一 背景 在面向对象程序设计过程中 有时会面临要创建大量相同或相似对象实例的问题 创建那么多的对象将会耗费很多的系统资源 它是系统性能提高的一个瓶颈 例如 围棋和五子棋中的黑白棋子 图像中的坐标点或颜色 局域网中的路由器 交换机和集线器 教
  • 14. Longest Common Prefix

    Write a function to find the longest common prefix string amongst an array of strings string subCommon string s1 string
  • js 将图片转为base64格式

    两种方式 1 利用canvas绘制图片 适用转换本地路径图片 2 通过网络请求图片地址 并返回blob格式 再操作 适用服务器端图片 1 利用canvas绘制 data return img4 mounted this imgToBase6
  • vue+element-ui el-tabs切换面板el-tab-pane切换

    在vue项目中 el tabs在页面的右侧显示 切换面板 下面的内容是正常显示的 效果如下 代码如下 父组件
  • java 使用stream累加对象中某个属性的值并返回总和

    假设有一个包含对象的List列表 每个对象都有一个属性value 可以使用Java 8中的Stream流来累加对象中某个属性的值并返回总和 以下是一些可能的实现方法 1 使用reduce方法 List
  • 安卓APP_ 布局(8) —— 基于 RecyclerView 的 ViewPager2翻页

    摘自 安卓APP 布局 8 基于 RecyclerView 的 ViewPager2翻页 作者 丶PURSUING 发布时间 2021 04 20 15 37 54 网址 https blog csdn net weixin 4474282
  • spring data jpa 查询参数为空的问题

    spring data jpa 查询参数为空的问题 https bbs csdn net topics 390968657
  • 怎么转发CSDN中的文章

    2018年09月24日 19 28 33 jackfjw 阅读数 900更多 分类专栏 Html 版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csd
  • [当人工智能遇上安全] 2.清华张超老师 - GreyOne: Discover Vulnerabilities with Data Flow Sensitive Fuzzing

    您或许知道 作者后续分享网络安全的文章会越来越少 但如果您想学习人工智能和安全结合的应用 您就有福利了 作者将重新打造一个 当人工智能遇上安全 系列博客 详细介绍人工智能与安全相关的论文 实践 并分享各种案例 涉及恶意代码检测 恶意请求识别
  • Qt信号与槽的链接3种方法详解

    转载自 14条消息 Qt5 9 2 VS2017入门实例 透彻解析 冯爽朗的博客 CSDN博客 vs qt 示例 由于现在书上介绍的大部分都是Qt Creator 并没有介绍Qt VS的教程 虽然说很相似 但是也有很多地方不同 对于初学者特