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虚拟机的主要组成部分有哪些? 答案: 主要组成部分…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
