Qt 信号和槽
目录
概念
代码
mainwindow.h
me.h
xiaohuang.h
main.cc
mainwindow.cc
me.cc
xianghuang.cc
mainwindow.ui
自定义信号的要求和注意事项:
自定义槽的要求和注意事项:
概念
信号槽是 Qt 框架引以为豪的机制之一。所谓信号槽,实际就是观察者模式(发布-订阅模式)。当某个
事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。信号 的本质就是事件
信号的呈现形式就是函数, 也就是说某个事件产生了, Qt框架就会调用某个对应的信号函数, 通知使用者。
槽函数是一类特殊的功能的函数,在编码过程中也可以作为类的普通成员函数来使用。之所以称之为槽函数是因为它们还有一个职责就是对Qt框架中产生的信号进行处理。在Qt中信号和槽函数都是独立的个体,本身没有任何联系,但是由于某种特性需求我们可以将二者连接到一起,在Qt中我们需要使用
QOjbect类中的connect函数进二者的关联。
代码
mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include "me.h" #include "xiaohuang.h"QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();//添加HungryBtn的槽函数void HungrySlot();private:Ui::MainWindow *ui;Me* _me;Xiaohuang* _xh; }; #endif // MAINWINDOW_Hme.h
#ifndef ME_H #define ME_H#include <QObject>class Me : public QObject {Q_OBJECT public:explicit Me(QObject *parent = nullptr);public slots:void eat();void eat(QString msg);};#endif // ME_Hxiaohuang.h
#ifndef XIAOHUANG_H #define XIAOHUANG_H#include <QObject>class Xiaohuang : public QObject {Q_OBJECT public:explicit Xiaohuang(QObject *parent = nullptr);signals:void hungry();void hungry(QString msg); };#endif // XIAOHUANG_Hmain.cc
#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);MainWindow w;w.show();return a.exec(); }mainwindow.cc
#include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);//方法一:标准信号和槽函数connect(ui->closeBtn,&QPushButton::clicked,this,&MainWindow::close);//方法二:自定义信号和槽函数_me = new Me;_xh = new Xiaohuang;//因为自定义的信号不能让qt框架去发送,所以我们用qt框架有的信号关联我们的自定义信号//间接去让他发送我们的自定义信号//a 这个是信号连接槽函数去间接发送信号//connect(ui->HungryBtn,&QPushButton::clicked,this,&MainWindow::HungrySlot);//b 现在我们信号连接信号//connect(ui->HungryBtn,&QPushButton::clicked,_xh,&Xiaohuang::hungry);//connect(_xh,&Xiaohuang::hungry,_me,&Me::eat);//但是对于带参的,Qt5这么写就有问题,因为重载了,所以编译器就不知道选带参还是不带的,所以有语法错误//我们就可以在外部定义一个函数指针来说明是带参的还是不带参的//void (Xiaohuang::* Xh1)() = &Xiaohuang::hungry;void (Xiaohuang::* Xh2)(QString) = &Xiaohuang::hungry;void (Me::* myp)(QString) = &Me::eat;//对于有传参的写法connect(_xh,Xh2,_me,myp);connect(_xh,Xh2,_me,myp);//我们上面是Qt5的信号和槽处理方式,现在我们来看Qt4的connect(_xh,SIGNAL(hungry()),_me,SLOT(eat()));//对于有传参的写法connect(_xh,SIGNAL(hungry(QString)),_me,SLOT(eat(QString)));connect(ui->HungryBtn,&QPushButton::clicked,this,&MainWindow::HungrySlot);//推荐使用Qt5,因为Qt4是宏替换,没有安全检查 }MainWindow::~MainWindow() {delete ui; }void MainWindow::HungrySlot() {//按下按钮,发送自定义信号emit _xh->hungry();emit _xh->hungry("海鲜"); }me.cc
#include "me.h" #include <QDebug>Me::Me(QObject *parent) : QObject(parent) {}void Me::eat() {qDebug()<<"我带你去吃饭"; }void Me::eat(QString msg) {qDebug()<<"我带你去吃:"<<msg; }xianghuang.cc
#include "xiaohuang.h"Xiaohuang::Xiaohuang(QObject *parent) : QObject(parent) {}mainwindow.ui
自定义信号的要求和注意事项:
信号是类的成员函数返回值必须是 void 类型信号的名字可以根据实际情况进行指定参数可以随意指定, 信号也支持重载信号需要使用 signals 关键字进行声明, 使用方法类似于public等关键字信号函数只需要声明, 不需要定义(没有函数体实现)在程序中发射自定义信号: 发送信号的本质就是调用信号函数
习惯性在信号函数前加关键字: emit, 但是可以省略不写emit只是显示的声明一下信号要被发射了, 没有特殊含义底层 emit == #define emit// 举例: 信号重载 // Qt中的类想要使用信号槽机制必须要从QObject类派生(直接或间接派生都可以) class Test : public QObject {Q_OBJECT signals:void testsignal();// 参数的作用是数据传递, 谁调用信号函数谁就指定实参// 实参最终会被传递给槽函数void testsignal(int a); };自定义槽的要求和注意事项:
返回值必须是 void 类型
槽也是函数, 因此也支持重载
槽函数需要指定多少个参数, 需要看连接的信号的参数个数
槽函数的参数是用来接收信号传递的数据的, 信号传递的数据就是信号的参数
- 举例:
- 信号函数: void testsig(int a, double b);
- 槽函数: void testslot(int a, double b);
- 总结:
- 槽函数的参数应该和对应的信号的参数个数, 从左到右类型依次对应
- 信号的参数可以大于等于槽函数的参数个数 == 信号传递的数据被忽略了
- 信号函数: void testsig(int a, double b);
- 槽函数: void testslot(int a);
Qt中槽函数的类型是多样的Qt中的槽函数可以是
类的成员函数、全局函数、静态函数、Lambda表达式(匿名函数)
槽函数可以使用关键字进行声明: slots (Qt5中slots可以省略不写)
- public slots:
- private slots: –> 这样的槽函数不能在类外部被调用
- protected slots: –> 这样的槽函数不能在类外部被调用
// 槽函数书写格式举例 // 类中的这三个函数都可以作为槽函数来使用 class Test : public QObject {public:void testSlot();static void testFunc();public slots:void testSlot(int id); };
相关文章:
Qt 信号和槽
目录 概念 代码 mainwindow.h me.h xiaohuang.h main.cc mainwindow.cc me.cc xianghuang.cc mainwindow.ui 自定义信号的要求和注意事项: 自定义槽的要求和注意事项: 概念 信号槽是 Qt 框架引以为豪的机制之一。所谓信号槽,实际就是观察者模式(发布-订…...
Linux基本命令二
Linux基本命令二 1、head 命令 head **作用:**用于查看文件的开头部分的内容,有一个常用的参数 -n 用于显示行数,默认为 10,即显示 10 行的内容 **语法:**head [参数] [文件] 命令参数: 参数…...
isbn api开放接口
接口地址:http://openapi.daohe168.com.cn/api/library/isbn/query?isbn9787115618085&appKeyd7c6c07a0a04ba4e65921e2f90726384 响应结果: { "success": true, "code": "200", "message": …...
助力企业实现更简单的数据库管理,ATOMDB 与 TDengine 完成兼容性互认
为加速数字化转型进程,当下越来越多的企业开始进行新一轮数据架构改造升级。在此过程中,全平台数据库管理客户端提供了一个集中管理和操作数据库的工具,提高了数据库管理的效率和便利性,减少了人工操作的复杂性和错误率࿰…...
如何通过低代码工具,提升运输行业的运营效率和服务质量
《中国数字货运发展报告》显示,2022年我国公路货运市场规模在5万亿元左右。其中,数字货运整体市场规模约为7000亿元,市场渗透率约为15%。而以小微企业为主的货运行业,却以小、散、乱的行业特征,承载着5万亿元左右的市场…...
Vue3中调用外部iframe链接方法
业务场景,点击某个按钮需要跳转到外部iframe的地址,但是需要在本项目内显示。以前项目中写过调用外部链接的功能,是有菜单的,但是这次是按钮,所以不能直接把地址配到菜单里。 实现方法:在本地路由文件里写个…...
Node——事件的监听与触发
Node.js是由事件驱动的,每个任务都可以当作一个事件来处理,本贴将对Node.js中的events模块及其中处理事件的类EventEmitter的使用进行详细讲解。 1、EventEmitter对象 在JavaScript中,通过事件可以处理许多用户的交互,比如鼠标…...
一个基于.NET Core开源、跨平台的仓储管理系统
前言 今天给大家推荐一个基于.NET Core开源、跨平台的仓储管理系统,数据库支持MSSQL/MySQL:ZEQP.WMS。 仓储管理系统介绍 仓储管理系统(Warehouse Management System,WMS)是一种用于管理和控制仓库操作的软件系统&…...
主机安全-WindowsLinux的SSH安全加固
信息安全相关 - 建设篇 第三章 主机安全-Linux的SSH安全加固 信息安全相关 - 建设篇系列文章回顾下章内容主机安全-Linux的SSH安全加固前言Windows openssh相关命令,安装openssh获取openssh命令Windows openssl相关命令,安装Git获取openssl命令修复 CVE-…...
pcie-2-rj45速度优化
背景: 目前用iperf3打流传输速率达不到要求,千兆实际要求跑到800M以上: 优化方案: 1.优化defconfig: 首先编译user版本验证看是否正常 debug版本关闭CONFIG_SLUB_DEBUG_ON宏控。 2.找FAE ,通过更换驱动,或者更新驱动来优化 3.绑定大核: 以8125网卡为例,udp…...
AWVS 使用方法归纳
1.首先确认扫描的网站,以本地的dvwa为例 2.在awvs中添加目标 输入的地址可以是域名也可以是ip,只要本机可以在浏览器访问的域名或ip即可 添加地址及描述之后,点击保存,就会展现出目标设置选项 business criticality译为业务关键…...
数据库基础入门 — SQL运算符
我是南城余!阿里云开发者平台专家博士证书获得者! 欢迎关注我的博客!一同成长! 一名从事运维开发的worker,记录分享学习。 专注于AI,运维开发,windows Linux 系统领域的分享! 本…...
SELinux零知识学习二十九、SELinux策略语言之类型强制(14)
接前一篇文章:SELinux零知识学习二十八、SELinux策略语言之类型强制(13) 二、SELinux策略语言之类型强制 4. 类型规则 类型规则在创建客体或在运行过程中重新标记时指定其默认类型。在策略语言中定义了两个类型规则: type_transtition在域转换过程中标记行为发生时以及创…...
Git控制指令
git status查看当前本地分支的修改状态 git diff 文件路径 查看具体文件的修改内容 git log打印用户信息 git remote -v查看远程地址 git checkout -- *还原被删除的文件 git rm -r --force .删除本地所有文件 git commit -m "Remove all files from repositor…...
C#中警告CA1050、CA1821、CA1822、CA1859、CA2249及处理
目录 一、CA1050警告及处理 1.如何解决冲突: 2.何时禁止显示警告: 二、CA1821警告及处理 三、CA1822警告及处理 四、CA1859警告及处理 1.警告解决之前 2.警告解决之后 3.解决办法 1.警告解决之前 2.警告解决之后 3.解决办法 五、CA2249警告…...
【Cmake】Cmake基础学习
CMake学习 一、基础学习 1. 利用Cmake进行单个源代码构建可执行文件 (1)基础命令 最基本的 CMake项目是由单个源代码文件构建的可执行文件。对于这样的简单项目,只需要一个包含三个命令的 CMakeLists.txt 文件。 注意: 虽然 CMake 支持大写、小写和混合大小写命令,但是…...
路径规划之Best-First Search算法
系列文章目录 路径规划之Dijkstra算法 路径规划之Best-First Search算法 路径规划之Best-First Search算法 系列文章目录前言一、Best-First Search算法1.1 起源1.2 过程 三、简单使用 前言 Best-First Search算法和Dijkstra算法类似,都属于BFS的扩展或改进 一、…...
【Layui】动态时间线
官方时间线 代码<fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;">...
进程、线程以及进程与线程的区别
进程 1.什么是进程? 进程是进程实体的运行过程,是系统进行资源分配和资源调度的一个独立单位。 进程实体(又叫进程映像)由进程控制块(PCB),程序段,数据段三部分构成。 PCB 进程控…...
Java中的jvm——面试题+答案(Java虚拟机的基本概念,包括内存区域、类加载机制、垃圾回收等)——第15期
什么是Java虚拟机(JVM)? 答案: Java虚拟机是Java程序运行的环境,负责将Java源代码编译成字节码,并在运行时执行这些字节码。 Java虚拟机的主要组成部分有哪些? 答案: 主要组成部分…...
7个实用技巧!Vue组件测试指南:基于TypeScript-Vue-Starter的Jest单元测试实战
7个实用技巧!Vue组件测试指南:基于TypeScript-Vue-Starter的Jest单元测试实战 【免费下载链接】TypeScript-Vue-Starter A starter template for TypeScript and Vue with a detailed README describing how to use the two together. 项目地址: https…...
Fish Speech-1.5多语种TTS部署案例:国际学校双语教学音频批量生成实践
Fish Speech-1.5多语种TTS部署案例:国际学校双语教学音频批量生成实践 想象一下,一所国际学校的老师,每天需要为不同年级、不同语言背景的学生准备中英文对照的教学音频。传统方法要么是老师自己录制,耗时耗力且难以保证发音标准…...
OKNet实战:用63x63超大卷积核搞定图像去雾/去雪/去模糊(附PyTorch配置指南)
OKNet实战:用63x63超大卷积核搞定图像去雾/去雪/去模糊(附PyTorch配置指南) 当你在处理一张被雾气笼罩的风景照,或是被雪花覆盖的街景,亦或是因手抖而模糊的人物特写时,是否曾想过AI如何让这些图像重获新生…...
天孚通信冲刺港股:年营收51亿 利润20亿,派息5.4亿 市值2790亿
雷递网 雷建平 4月11日苏州天孚光通信股份有限公司(简称:“天孚通信”)日前递交招股书,准备在港交所上市。天孚通信2015年在深交所创业板上市。截至周五收盘,天孚通信股价为358.9元,市值为2790亿元。2026年…...
如何在Windows和Linux上快速免费解锁VMware的macOS虚拟机支持
如何在Windows和Linux上快速免费解锁VMware的macOS虚拟机支持 【免费下载链接】unlocker VMware Workstation macOS 项目地址: https://gitcode.com/gh_mirrors/unloc/unlocker 想在VMware中运行macOS虚拟机吗?VMware解锁工具是您的终极解决方案!…...
如何快速实现WPS与Zotero无缝集成:终极学术写作效率指南
如何快速实现WPS与Zotero无缝集成:终极学术写作效率指南 【免费下载链接】WPS-Zotero An add-on for WPS Writer to integrate with Zotero. 项目地址: https://gitcode.com/gh_mirrors/wp/WPS-Zotero WPS-Zotero插件是专为学术工作者设计的革命性工具&#…...
前端交互设计实现
前端交互设计实现:打造流畅用户体验的艺术 在数字化时代,前端交互设计已成为用户体验的核心。无论是网页、移动应用还是智能设备界面,优秀的交互设计能显著提升用户满意度与留存率。前端交互设计不仅关乎视觉美观,更注重用户操作…...
今天不看Function Calling新范式,明天就被淘汰:2026奇点大会宣布——所有通过LMSYS评测的Agent必须支持动态Tool Discovery
第一章:2026奇点智能技术大会:大模型FunctionCalling 2026奇点智能技术大会(https://ml-summit.org) Function Calling 的本质演进 在2026奇点智能技术大会上,Function Calling 不再是简单工具调用的语法糖,而是大模型与外部系统…...
为什么Elasticsearch的text类型字段默认不支持精确匹配?
为什么Elasticsearch的text类型字段默认不支持精确匹配? Elasticsearch作为一款强大的搜索引擎,其设计初衷是为了高效处理全文检索需求。许多初次接触的用户可能会疑惑:为什么text类型的字段默认不支持精确匹配?比如搜索"苹…...
前端代码质量
前端代码质量:构建卓越用户体验的基石 在当今快速迭代的互联网时代,前端代码质量直接影响用户体验、维护成本和团队协作效率。高质量的代码不仅能减少错误,还能提升性能,让产品更具竞争力。那么,如何衡量和提升前端代…...
