【六】【QT开发应用】信号和信号槽的五种写法

第一种写法

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

第二种写法

在这里插入图片描述

第三种写法

在这里插入图片描述

第四种写法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

第五种写法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

完整代码

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void btnSlot();void slot2();void on_btnOpen_clicked();void on_actionexit_triggered();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//第一种写法//connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(btnSlot()));//第二种写法//connect(ui->pushButton,&QPushButton::clicked,this,&MainWindow::btnSlot);//第三种写法// connect(ui->pushButton,&QPushButton::clicked,[=]{//     QMessageBox::information(this,"title","clicked");// });//第四种写法//第五种写法}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::btnSlot(){QMessageBox::information(this,"title","clicked");
}void MainWindow::slot2(){QMessageBox::information(this,"title","clicked");
}void MainWindow::on_btnOpen_clicked(){QMessageBox::information(this,"title","clicked");
}void MainWindow::on_actionexit_triggered(){QMessageBox::information(this,"title","clicked open ");close();
}

复盘

第一种写法

旧的信号和槽机制

在 Qt 4 及更早版本中,信号和槽的连接使用的是字符串形式的信号和槽。这种方式通过 SIGNAL 和 SLOT 宏将信号和槽的签名转换为字符串。

connect(senderObject, SIGNAL(signalSignature()), receiverObject, SLOT(slotSignature()));

在本文中的例子:

connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(btnSlot()));

信号 (SIGNAL):
SIGNAL(clicked()):这里的 clicked() 是 QPushButton 类的一个信号。当按钮被点击时,这个信号会被发射。
SIGNAL 宏将 clicked() 转换为字符串 “2clicked()”。这里的 2 是内部使用的一个标记,表示这是一个信号。
槽 (SLOT)
SLOT(btnSlot()):这里的 btnSlot() 是你的槽函数,它将在信号发射时被调用。
SLOT 宏将 btnSlot() 转换为字符串 “1btnSlot()”。这里的 1 是内部使用的一个标记,表示这是一个槽。
连接:
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(btnSlot())):
当 ui->pushButton 被点击时,clicked() 信号被发射。
连接机制捕获到 clicked() 信号,并调用与之连接的槽函数 btnSlot()。

缺点:
缺乏编译时类型检查。如果信号和槽的参数不匹配,错误只能在运行时发现,而不是编译时。

非常不推荐.

第二种写法

现代信号和槽机制

在 Qt 5 及更高版本中,推荐使用基于函数指针的信号和槽连接方式。这种方式提供了编译时类型检查,更加安全和现代化。

connect(senderObject, &SenderClass::signal, receiverObject, &ReceiverClass::slot);

在本文中的例子:

connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::btnSlot);

信号:
&QPushButton::clicked: 这是 QPushButton 类的一个信号。当按钮被点击时,这个信号会被发射。
使用 & 获取成员函数指针,这是 C++ 标准的写法,确保在编译时进行类型检查。
槽:
&MainWindow::btnSlot: 这是你的槽函数,它将在信号发射时被调用。
同样使用 & 获取成员函数指针。
连接:
connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::btnSlot):
当 ui->pushButton 被点击时,clicked() 信号被发射。
连接机制捕获到 clicked() 信号,并调用与之连接的槽函数 btnSlot()。

推荐.

第三种写法

使用 Lambda 表达式作为槽函数

在现代 Qt 编程中,可以使用 C++11 引入的 lambda 表达式作为槽函数。Lambda 表达式是一种匿名函数,可以在定义时捕获变量,并且直接在连接信号和槽时使用。这种方式非常灵活,尤其适用于简单的槽函数。

connect(ui->pushButton, &QPushButton::clicked, [=] {QMessageBox::information(this, "title", "clicked");
});

信号:
&QPushButton::clicked: 这是 QPushButton 类的一个信号。当按钮被点击时,这个信号会被发射。
Lambda 表达式:
[=]:这是 lambda 捕获列表,表示按值捕获外部作用域中的所有变量。在这个例子中,this 指针会被捕获,以便在 lambda 内部使用。
{ … }:这是 lambda 表达式的主体,包含要在信号发射时执行的代码。
QMessageBox::information
QMessageBox::information 是一个静态函数,用于显示信息消息框。它接受父窗口、标题和消息内容作为参数。
this 作为父窗口指针传递给 QMessageBox::information,表示消息框的父窗口是当前窗口。
“title” 和 “clicked” 是消息框的标题和消息内容。

推荐.

第四种写法

连线法,不推荐,因为当信号和槽多了,连线会很复杂且繁琐.

第五种写法

使用命名槽函数

在 Qt 中,可以通过在类中定义成员函数并将其作为槽函数来处理信号。使用命名槽函数是一个非常常见和推荐的方法,特别是在处理较复杂的逻辑时。这种方法具有更好的可读性和可维护性。
在你的示例中:

void MainWindow::on_btnOpen_clicked(){QMessageBox::information(this,"title","clicked");
}

槽函数定义
void MainWindow::on_btnOpen_clicked():这是在 MainWindow 类中定义的一个槽函数。命名约定通常是 on_< widget_name >_< signal >(),表示这是 widget_name 触发的 signal 的处理函数。

QMessageBox::information(this, “title”, “clicked”):当槽函数被调用时,会弹出一个信息框,显示标题为 “title” 的消息,内容为 “clicked”。
连接信号和槽
可以在 Qt Designer 中通过 UI 文件自动生成连接,也可以在代码中手动连接。

在 Qt Designer 中自动生成连接

UI 文件中设置槽函数
使用 Qt Designer 创建界面时,可以直接为按钮的 clicked 信号指定槽函数。例如,在按钮的属性编辑器中找到 Signals and Slots,然后设置 clicked 信号的处理函数为 on_btnOpen_clicked。
自动生成连接代码
Qt Designer 会在生成的 UI 文件代码中自动创建连接,通常在 setupUi 函数中。
你不需要手动编写 connect 函数调用,Qt 框架会在运行时自动找到并连接信号和槽。

推荐.

结尾

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。
同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。
谢谢您的支持,期待与您在下一篇文章中再次相遇!

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

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

相关文章

Golang | Leetcode Golang题解之第172题阶乘后的零

题目&#xff1a; 题解&#xff1a; func trailingZeroes(n int) (ans int) {for n > 0 {n / 5ans n}return }

用全志T113做了块多功能卡片电脑,成本只要60块

FunnyPi-T113是一款基于全志T113-S3/D1S处理器的完全开源多功能开发板&#xff0c;设计FunnyPi最初的目的是想借此T113卡片电脑来满足日常学习&#xff0c;并结合T113高效能和低功耗的特点&#xff0c;来满足像语音助手&#xff0c;智能家居屏幕、桌面摆件屏、博客服务器等嵌入…

Maven笔记(更新中)

一、Maven简介 Maven是一款为Java项目构建,依赖管理的工具(软件),使用Maven可以自动化构建,测试,打包和发布项目,大大提高了开发效率和质量 Maven主要作用理解 依赖管理 Maven可以管理项目的依赖,包括自动下载所需依赖库,自动下载依赖所需的依赖并且保证版本没有冲突,依赖版…

(五)数据采集与处理基础练习题(17道选择题)

本文整理了数据采集与处理基础相关的练习题&#xff0c;共17道&#xff0c;适用于想巩固理论基础的同学。来源&#xff1a;如荷学数据科学题库&#xff08;CDA二级-第二三四章&#xff09;。 1&#xff09; 2&#xff09; 3&#xff09; 4&#xff09; 5&#xff09; 6&#x…

电脑系统重装怎么操作?分享四个win10重装系统方法

“我遇到了一些笔记本电脑的问题&#xff0c;别人告诉我解决这个问题需要重新安装Win10电脑系统。但我不记得我把光盘放在哪里了&#xff0c;我能否在不丢失文件的情况下重新安装操作系统&#xff1f;电脑系统重装怎么操作&#xff1f;”虽然电脑自带系统中有多种方法可供选择&…

工业边缘计算网关

1 介绍 HINETG系列边缘计算网关&#xff08;Linux操作系统&#xff09;&#xff0c;是华辰智通的—款面向工业现场设备接入、数据采集、设备监控的工业级边缘计算网关。采用ARM Cortex-A7 800MHz高性能CPU,拥有以太网、串口、CAN口、IO口等丰富的接口&#xff0c;支持以太网、…

项目实践---Windows11中安装Zookeeper/Hadoop/Hive的部分问题解决

一.Hadoop与Hive兼容版本选择 正常来说&#xff0c;Hadoop与Hive版本不兼容会出现很多问题导致hive安装失败&#xff0c;可以先确定HIve的版本&#xff0c;比如&#xff1a;要用Hive3.1.2版本&#xff0c;该如何确定使用Hadoop的版本呢&#xff0c;需要我们在hive源码中找到对…

【性能优化】表分桶实践最佳案例

分桶背景 随着企业的数据不断增长&#xff0c;数据的分布和访问模式变得越来越复杂。我们前面介绍了如何通过对表进行分区来提高查询效率&#xff0c;但对于某些特定的查询模式&#xff0c;特别是需要频繁地进行数据联接查或取样的场景&#xff0c;仍然可能面临性能瓶颈。此外…

借助AI营销类API,实现自动化的营销流程

借助AI营销类API&#xff0c;企业可以实现自动化的营销流程&#xff0c;提高效率和效果&#xff0c;并节省大量的时间和资源。这些API利用人工智能和机器学习的技术&#xff0c;能够自动化地执行各种营销任务和流程。首先&#xff0c;AI营销类API可以帮助企业实现自动化的市场调…

2025届阳光保险集团应届生校招社招入职测评真题题库北森自适应测评题库

第1题 人类使用塑料袋的历史很短&#xff0c;但对塑料袋的指责却不绝于耳。全世界每年要消耗5000亿到1万亿个塑料袋。废弃的塑料袋被掩埋会影响农作物吸收营养和水分&#xff0c;污染地下水;焚烧塑料袋则会产生有毒气体&#xff0c;影响人体健康。因此如何处理塑料袋十分重要。…

大数据学习-Hive 函数

目录 Hive函数 Hive的内置函数 数学函数 取整函数: round 指定精度取整函数: round 向下取整函数: floor 向上取整函数: ceil 取随机数函数: rand 幂运算函数: pow 绝对值函数: abs 字符串函数 字符串长度函数&#xff1a;length 字符串反转函数&#xff1a;reverse 字…

STM32——温湿度采集与显示

一、I2C协议 关于I2C协议的基本原理和时序协议 12C协议使用两条线&#xff1a;SDA&#xff08;Serial Data Line&#xff0c;串行数据线&#xff09;和SCL&#xff08;Serial Clock Line&#xff0c;串行时钟线&#xff09;。这两条线都是开漏输出&#xff0c;意味着它们需要上…

【AI作曲】毁掉音乐?早该来了!一个网易音乐人对于 AI 大模型音乐创作的思辨

引言&#xff1a;AI在创造还是毁掉音乐&#xff1f; 正如当初 midjourney 和 StableDiffusion 在绘画圈掀起的风波一样&#xff0c;suno 和 各大音乐大模型的来临&#xff0c;其实早该来了。 AI 在毁掉绘画&#xff1f;或者毁掉音乐&#xff1f; 没错&#xff0c;但也错了。…

MGV电源维修KUKA机器人电源模块PH2003-4840

MGV电源维修 库卡电源模块维修 机器人电源模块维修 库卡控制器维修 KUKA电源维修 库卡机器人KUKA主机维修 KUKA驱动器模块维修 机械行业维修&#xff1a;西门子系统、法那克系统、沙迪克、FIDIA、天田、阿玛达、友嘉、大宇系统&#xff1b;数控冲床、剪板机、折弯机等品牌数控…

语音相关算法学习整理

最近看了一下百度paddlespeech的一些公开课&#xff0c;把课程里的视频内容大体听了一下&#xff0c;现在整理一下笔记。教程链接见&#xff1a;飞桨AI Studio星河社区-人工智能学习与实训社区 语音识别的过程可以这样简单概括&#xff1a; 将声音信号经过预加重、加窗、fft等…

JavaWeb——Mysql的启动/登录/卸载

目录 1.Mysql服务器 2.Mysql的简单使用 2.1 启动Mysql&#xff1a; 2.2 登录Mysql 2.3 退出 3. 连接别人的数据库 4.卸载mqsql 1.Mysql服务器 安装了Mysql的计算机都成为Mysql服务器 2.Mysql的简单使用 2.1 启动Mysql&#xff1a; 第一种方法&#xff1a;搜索服务&am…

如何在微信小程序使用vant 进行自定义底部tabbar组件

在微信小程序中使用 Vant 自定义底部 TabBar 需要进行以下步骤&#xff1a; 一、首先&#xff0c;你需要在 app.json 文件中配置自定义 TabBar。 在 "tabBar" 字段中&#xff0c;设置 "custom" 为 true&#xff0c;表示使用自定义 TabBar。 app.json示例…

python18 正则表达式

python18 正则表达式 正则表达式 re.match(),re.search(),re.findall(),re.sub(),re.split() 元字符 具有特殊意义的专用字符 导入模块 improt re代码 正则表达式 re.match(),re.search(),re.findall(),re.sub(),re.split() 元字符 具有特殊意义的专用字符 导入模块 improt rei…

Docker基本使用和认识

目录 基本使用 镜像仓库 镜像操作 Docker 如何实现镜像 1) namespace 2) cgroup 3) LXC Docker常见的网络类型 bridge网络如何实现 基本使用 镜像仓库 镜像仓库登录 1)docker login 后面不指定IP地址&#xff0c;则默认登录到 docker hub 上 退出 2)docker logo…

大数据经典sql

一、连续登录问题 问题&#xff1a;1&#xff09;、每个用户连续登录最大天数 2&#xff09;、连续登录大于三天的用户数 分析&#xff1a;本质都是计算用户连续登录天数 方案一&#xff1a;利用排序窗口 select a.user_id,a.date_rslt,count(1) as cnt from (select t.…