信号与槽机制一
一、信号与槽
1、什么是信号与槽?
信号和槽是用于对象之间的通信,它是Qt的核心机制,在Qt编程中有着广泛的应用。如果想学好Qt,一定要充分掌握信号的槽的概念与使用。
2、信号和槽的代码实例
在Qt中,发送对象、发送的信号、接收对象、槽可以通过很多种方式连接。下面通过一些例子逐一做演示,如下:
2.1、Qt4使用宏
在Qt4及之前的版本基于connect+宏实现信号与槽绑定,其中发送信号和槽函数需要用 SIGNAL() 和 SLOT() 来进行声明,connect函数声明如下:
QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
比如点击登录按键完成登录的例子,代码可以这样写:
// 槽函数声明
private slots:void login();
通过connect绑定槽函数,如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 登录按键绑定槽函数connect(this->ui->btn_ok, SIGNAL(clicked(bool)), this, SLOT(login()));}void MainWindow::login()
{QString username = ui->lineEdit_username->text();QString password = ui->lineEdit_password->text();if (username == "jack" && password == "12345") {qDebug() << "login success";} else {qDebug() << "login fail";}
}
注意:
- 声明槽函数要使用private slots或public slots关键字
- 信号和槽参数不能包含任何变量名,只能包含类型
2.2、使用Qt Creator添加信号的槽函数
通过Qt Creator 界面来完成发送信号和槽函数的连接,比如右键点击一个按钮,然后选择“转到槽”:

Qt Creator会自动生成如下代码,首先是槽函数的声明:
// 槽函数声明
private slots:void on_btn_cancel_clicked(bool checked);
槽函数实现,如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_btn_cancel_clicked(bool checked)
{}
使用这种方法不需要使用connect函数将信号与槽函数做连接。 这里槽函数的命名有一定的规则,一般是 on_objectname_signal 这样来命名的。这种方法优点是减少了手动敲代码的工作量,缺点是究竟有哪些信号与槽函数做了连接不易被发现,没有connect 函数看起来直观。
2.3、Qt5新connect函数
Qt5推出了新的connect函数,不需要使用SIGNAL()和SLOT()宏,可以在编译时做类型检查,connect函数声明如下:
QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type = Qt::AutoConnection)
使用这种方法槽函数的声明不需要放到slots中,只要像普通的函数一样声明就可以了,类型需要与信号保持一致,下面给登录按键绑定槽函数,如下:
class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();// 声明槽函数,与普通的成员函数一样void login();private:Ui::MainWindow *ui;
};
绑定槽函数
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 登录按键绑定槽函数connect(ui->btn_ok, &QPushButton::clicked, this, &MainWindow::login);
}void MainWindow::login()
{qDebug() << "login";
}
2.4、使用函数指针
在Qt 5版本的connect 函数里,信号与槽函数的参数其实都是函数指针,当信号或槽函数有重载时,使用函数指针可以明确告诉编译器使用哪一个重载函数避免歧义
public:MainWindow(QWidget *parent = nullptr);~MainWindow();// 声明两个同名的login函数void login();void login(int state);
通过函数指针绑定槽函数
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 定义函数指针(注意:声明指向成员函数的指针时,要增加类作用域)void (MainWindow::*pfnLoginSlot)() = &MainWindow::login;// 登录按键绑定无参槽函数connect(ui->btn_ok, &QPushButton::clicked, this, pfnLoginSlot);
}void MainWindow::login()
{qDebug() << "login";
}void MainWindow::login(int state)
{qDebug() << "login state";
}
2.5、使用Lambda表达式
在connect函数中,槽函数参数可以改用Lambda表达式的方式来进行传参。使用 Lambda表达式的好处是代码的书写更加方便快捷,同时不需要在类中对槽函数做任何的声明了
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 使用Lamdbda表达式作为槽函数connect(ui->btn_ok, &QPushButton::clicked, this, [=](){qDebug() << "login";});
}
3、小结
信号与槽提供了一种事件触发机制,发送者与接收者通过connect链接在一起,发送者与接收者之间是松耦合
相关文章:
信号与槽机制一
一、信号与槽 1、什么是信号与槽? 信号和槽是用于对象之间的通信,它是Qt的核心机制,在Qt编程中有着广泛的应用。如果想学好Qt,一定要充分掌握信号的槽的概念与使用。 2、信号和槽的代码实例 在Qt中,发送对象、发送的信…...
nodejs 复制文件到指定目录
var fs require(fs), path require(path), exec require(child_process).exec, sourcePath, targetPath; //获取命令行中的路径 process.argv.forEach(function (val, index, array) { if (index 2) { sourcePath val; } if (index 3) { targetPath val; } }); // 定义…...
第八章 使用Apache服务部署静态网站
文章目录 第八章 使用Apache服务部署静态网站一、网站服务程序1、网站服务介绍2、Apache程序介绍 二、配置服务文件参数1、Linux系统中的配置文件2、配置httpd服务程序时最常用的参数以及用途描述 三、SELinux安全子系统1、SELinux介绍2、SELinux服务配置模式3、Semanage命令4、…...
Three——四、几何体、高光网络材质、锯齿模糊以及GUI库的使用
文章: Three——一、初识Three以及基础的前端场景搭建(结尾含源码)Three——二、加强对三维空间的认识Three——三、动画执行、画布大小、渲染帧率和相机适配体验Three——四、几何体、高光网络材质、锯齿模糊以及GUI库的使用Three——五、点线模型对象、三角形概念…...
盲目自学网络安全只会成为脚本小子?
前言:我们来看看怎么学才不会成为脚本小子 目录: 一,怎么入门? 1、Web 安全相关概念(2 周)2、熟悉渗透相关工具(3 周)3、渗透实战操作(5 周)4、关注安全圈动…...
文从字顺|程序员须知,如何编写高质量代码
高质量代码是软件开发中至关重要的一部分。高质量的代码不仅可以提高软件的可维护性和可复用性,还可以增强软件的安全性和稳定性。同时,可以降低软件维护成本,提升开发效率,为用户提供更好的使用体验。 写出高质量代码是每个程序…...
PCIe物理层弹性缓存机制(详细)解析-PCIe专题知识(四)
目录 前言一、简介二、详细解析2.1 实例解析2.2 具体实现过程 三、总结四、其他相关链接1、PCI总线及发展历程总结2、PCIe物理层总结-PCIE专题知识(一)3、PCIe数据链路层图文总结-PCIe专题知识(二)4、PCIe物理层链路训练和初始化总…...
分片上传和断点续传的区别?实现思路是什么?
相同: 分片上传和断点续传都是网络传输中常用的重要技术 不同: 分片上传:将一个大文件切分为多个小文件进行上传。这种方式能够加快上传速度,降低服务器压力,特别适用于大型文件的上传。例如,在云存储系统…...
微前端 qiankun@2.10.5 源码分析(二)
微前端 qiankun2.10.5 源码分析(二) 我们继续上一节的内容。 loadApp 方法 找到 src/loader.ts 文件的第 244 行: export async function loadApp<T extends ObjectType>(app: LoadableApp<T>,configuration: FrameworkConfi…...
08异步请求:何种场景下应该使用异步请求?
异步在计算机科学中早就是一个比较常用的词汇,从操作系统的特性( 并发、共享、虚拟、异步)开始,异步就在处理并发操作中起到很大的作用,不仅如此,在软件层面,异步同样也是解决并发请求的一个关键过程,它可以将瞬时激增的请求进行更加灵活的处理,通过异步请求,客户端可…...
【深度学习 | Transformer】Transformers 教程:pipeline一键预测
文章目录 一、前言二、Computer vision2.1 Image classification2.2 Object detection2.3 Image segmentation2.4 Depth estimation 三、NLP3.1 Text classification3.2 Token classification3.3 Question answering3.4 Summarization3.5 Translation3.6 Language modeling3.6.…...
HTMLCSS
1、HTML 1.1 介绍 HTML 是一门语言,所有的网页都是用HTML 这门语言编写出来的,也就是HTML是用来写网页的,像京东,12306等网站有很多网页。 这些都是网页展示出来的效果。而HTML也有专业的解释 HTML(HyperText Markup Language)…...
【安装Nginx】
Linux上安装Nginx 文章目录 Linux上安装NginxUbuntuCentOS查看已安装的软件 Ubuntu 在 Ubuntu 上安装 Nginx 非常简单。只需按照以下步骤操作: 打开终端,更新软件包索引: sudo apt update安装 Nginx: sudo apt install nginx安…...
VSCode作业1:猜数字游戏和简单计数器(包含完整代码)
目录 猜数字游戏 一、使用‘random’函数获取随机数 二、 分情况讨论输入值大小情况 三、HTML代码 四、CSS样式及运行效果 简单计数器(计时器) 一、使用‘setInterval’函数实现计数效果 二、使用’clearInterval‘函数实现暂停计数和重新计数效果 …...
NANK OE骨传导开放式蓝牙耳机发布,极致体验拉满!
近日,中国专业音频品牌NANK南卡发布了全新一代——骨传导开放式蓝牙耳机NANK OE,耳机采用了传统真无线和骨传导的结合方式,带来更加舒适的佩戴体验和音质升级,同时还支持单双耳自由切换,全新的设计收获了市场的喜爱和认…...
看完这篇文章你就彻底懂啦{保姆级讲解}-----(I.MX6U驱动GPIO中断《包括时钟讲解》) 2023.5.9
目录 前言整体文件结构源码分析(保姆级讲解)中断初始化部分初始化GIC控制器初始化中断向量表设置中断向量表偏移 系统时钟初始化部分使能所有的时钟部分led初始化部分beep初始化部分key初始化部分按键中断初始化部分按键中断服务函数部分 while循环部分 …...
MySql -- 事务
目录 1.概念 2.事务的运用场景 3.事务的四大特点 4.执行事务带来的问题 4.1 脏读 4.2 不可重复度 4.3 幻读 5. MySQL中事务的隔离级别 1.概念 事务就是把若干个独立操作打包成一个整体而诞生的一种功能. 2.事务的运用场景 比如:A——>B 转账500 A的余额-500…...
关于大模型对未来影响的一点看法
人们总是高估了未来一到两年的变化,低估了未来十年的变革。 ---比尔盖茨 近来OpenAI的GPT技术可以说在全球都带来了巨大的影响,也让大家看到了什么叫大力出奇迹。chatGPT和GPT4的能力给了大家很大的震撼,其流畅自如、逻辑清晰、出众的能力&am…...
Android - 约束布局 ConstraintLayout
一、概念 解决布局嵌套过多的问题,采用方向约束的方式对控件进行定位。 二、位置约束 2.1 位置 至少要保证水平和垂直方向都至少有一个约束才能确定控件的位置。 layout_constraintLeft_toLeftOf我的左边,与XXX左边对齐。layout_constraintLeft_toRight…...
Addictive Multiplicative in NN
特征交叉是特征工程中的重要环节,在以表格型(或结构化)数据为输入的建模中起到了很关键的作用。 特征交互的作用,一是尽可能挖掘对目标有效的模式、特征,二是具有较好的可解释性,三是能够将对数据的洞见引…...
SDMatte与前端框架React集成:打造交互式在线图片编辑工具
SDMatte与前端框架React集成:打造交互式在线图片编辑工具 1. 引言:为什么需要在线图片编辑工具 电商商家每天需要处理大量商品图片,传统PS操作门槛高且效率低下。而专业设计师又需要更灵活的工具进行创意表达。基于React框架和SDMatte构建的…...
SiameseAOE中文-base惊艳效果:结构化输出JSON兼容下游BI/报表系统直连
SiameseAOE中文-base惊艳效果:结构化输出JSON兼容下游BI/报表系统直连 1. 模型效果惊艳展示 SiameseAOE通用属性观点抽取模型在中文文本处理方面表现出色,能够从非结构化文本中精准提取结构化信息。最令人印象深刻的是,模型输出的JSON格式数…...
解析RK3566平台双摄(OV5648+GC2145)的Split Mode配置实战
1. RK3566双摄系统架构解析 当我们需要在嵌入式设备上实现双摄像头功能时,RK3566平台提供了一个非常灵活的解决方案。这个平台虽然只有一个物理MIPI CSI-2 DPHY接口,但通过Split Mode技术,可以将其拆分为多个逻辑接口使用。这就好比一条四车道…...
PasteMD场景应用:微信聊天记录自动整理为会议纪要
PasteMD场景应用:微信聊天记录自动整理为会议纪要 1. 为什么你的会议纪要总是一团糟? 想象一下这个场景: 下午两点,项目组紧急拉了个微信群聊,大家七嘴八舌讨论了半小时,敲定了五个关键事项和三个责任人。…...
如何保证代码质量?
一、编码阶段:从源头控制质量1. 统一代码规范(强制执行)核心目标:减少风格差异,提高可读性常见工具:ESLint:代码规范校验Prettier:自动格式化Stylelint:样式规范…...
深入解析BLE空口报文抓取:从GAP广播到LESC安全通信全流程
1. BLE空口报文抓取基础 想要分析BLE设备间的通信过程,抓取空口报文是最直接有效的方法。这就像在两个人对话时,用录音设备记录下他们的每一句话。不过BLE通信使用的是2.4GHz无线频段,我们无法直接用耳朵听到这些"对话",…...
告别重复劳动:OpenClaw+nanobot批量重命名与整理照片实战
告别重复劳动:OpenClawnanobot批量重命名与整理照片实战 1. 为什么需要自动化照片整理 每次旅行回来,面对相机和手机里混杂的几百张照片,整理工作总是让人头疼。手动创建文件夹、按日期地点分类、重命名文件——这些重复劳动不仅耗时&#…...
网站外部 SEO 优化有哪些策略_SEO 网络推广与传统推广有什么区别
<h2>网站外部 SEO 优化有哪些策略</h2> <p>在当今的数字营销领域,外部 SEO 优化已经成为提升网站排名和流量的关键策略。外部 SEO(Search Engine Optimization)优化是一项通过外部手段提升网站在搜索引擎结果页面ÿ…...
FatFileSystem:面向资源受限MCU的轻量级FAT文件系统
1. FatFileSystem 嵌入式 FAT 文件系统库深度解析FatFileSystem 是一个轻量级、可移植的嵌入式 FAT 文件系统实现,专为资源受限的微控制器环境设计。它并非完整重写的 FAT32 标准栈(如 FatFs),而是对经典开源 FAT 实现的精简裁剪与…...
隐私计算新选择:OpenClaw+nanobot本地化数据处理
隐私计算新选择:OpenClawnanobot本地化数据处理 1. 为什么我们需要本地化数据处理方案 作为一名长期关注数据隐私的技术从业者,我最近在探索如何在不牺牲便利性的前提下,确保敏感数据处理的绝对安全。金融行业的朋友经常向我抱怨࿱…...
