当前位置: 首页 > news >正文

QT信号槽

目录

信号槽的概念

按钮的常用信号

自定义槽函数

自定义信号函数

自定义槽和信号注意的事项

信号与槽的拓展

lambda表达式


信号槽的概念

信号槽是Qt框架引以为豪的机制之一。所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号 (signal)这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect) 函数,意思是,将想要处理的信号和自己的一个函数 (称为槽 (slot) )绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。

connect()函数最常用的一般形式:
connect(sender, signal. receiver, slot):
参数解释:
        sender:发出信号的对象
        signal:发送对象发出的信号
        receiver:接收信号的对象
        slot:接收对象在接收到信号之后所需要调用的函数 (槽函数)

#include "widget.h"
#include <QPushButton>Widget::Widget(QWidget *parent): QWidget(parent)
{//创建一个按钮 点击按钮关闭窗口this->close();QPushButton *b = new QPushButton("点击关闭",this);//设置点击按钮 产生信号 会调用window close函数connect(b,&QPushButton::clicked,this,&Widget::close);
}Widget::~Widget()
{}

按钮的常用信号

在帮助中搜索QPushButton

点击信号

查看常用信号(点击 按下 释放 触发)

自定义槽函数

在类中public slots:下声明槽函数

#include "widget.h"
#include <QPushButton>
#include <qdebug.h>
Widget::Widget(QWidget *parent): QWidget(parent)
{b = new QPushButton;b->setParent(this);b->setText("点击发送信号");//注册信号与槽的连接//槽函数可以是普通的成员函数 还可以是槽函数//如果信号没有参数 槽函数也不能有参数 如果信号有参数 槽函数可以有也可以没有参数connect(b,&QPushButton::pressed,this,&Widget::print);
}void Widget::print()
{qDebug()<<"收到信号,打印信息";
}Widget::~Widget()
{}

可以看到,按钮被点击后信息被打印

自定义信号函数

父窗口点击按钮隐藏父窗口显示子窗口,子窗口点击按钮隐藏子窗口,并且发送信号10,

父窗口收到信号10,显示父窗口

sonwidget.h

#ifndef SONWIDGET_H
#define SONWIDGET_H#include <QWidget>
#include <QPushButton>
class Sonwidget : public QWidget
{Q_OBJECT
public:explicit Sonwidget(QWidget *parent = nullptr);QPushButton *b2;
signals://信号//信号没有返回值 可以有参数 信号函数不需要定义 只需要声明void window_hide_signal(int a);
public slots://槽void emit_mysignal();
};#endif // SONWIDGET_H

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include "sonwidget.h"
#include <QPushButton>class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = 0);~Widget();Sonwidget *sonwindow;QPushButton *b1;
public slots:void button_cd();void signal_cd(int a);
};#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent): QWidget(parent)
{this->setWindowTitle("父窗口");sonwindow = new Sonwidget;sonwindow->show();b1 = new QPushButton();b1->setText("隐藏父窗口,显示子窗口");b1->setParent(this);connect(b1,&QPushButton::clicked,this,&Widget::button_cd);connect(sonwindow,&Sonwidget::window_hide_signal,this,&Widget::signal_cd);
}void Widget::button_cd()
{this->hide();this->sonwindow->show();
}void Widget::signal_cd(int a)
{qDebug()<<a;this->show();this->sonwindow->hide();
}Widget::~Widget()
{}

sonwidget.cpp

#include "sonwidget.h"
#include <QPushButton>
Sonwidget::Sonwidget(QWidget *parent) : QWidget(parent)
{this->setWindowTitle("子窗口");b2 = new QPushButton();b2->setText("隐藏子窗口,显示父窗口");b2->setParent(this);connect(b2,&QPushButton::clicked,this,&Sonwidget::emit_mysignal);
}void Sonwidget::emit_mysignal()
{window_hide_signal(10);//发送10
}

10被打印

自定义槽和信号注意的事项

发送者和接收者都需要是 QObject 的子类 (当然,槽函数是全局函数、Lambda 表达式等无需接收者的时候除外);

信号和槽函数返回值是 void

信号只需要声明,不需要实现,槽函数需要声明也需要实现

槽函数是普通的成员函数,作为成员函数,会受到 public、private、protected 的影响;

使用 emit 在恰当的位置发送信号;

使用 connect()函数连接信号和槽。

任何成员函数、static 函数、全局函数和 Lambda 表达式都可以作为槽函数

信号槽要求信号和槽的参数一致,所谓一致,是参数类型一致。

如果信号和槽的参数不一致,允许的情况是,槽函数的参数可以比信号的少,即便如此,槽函数存在的那些参数的顺序也必须和信号的前面几个一致起来。这是因为,你可以在槽函数中选择忽略信号传来的数据 (也就是槽函数的参数比信号的少)。

信号与槽的拓展

一个信号可以和多个槽相连

        如果是这种情况,这些槽会一个接一个的被调用,但是它们的调用顺序是不确定的。多个信号可以连接到一个槽,只要任意一个信号发出,这个槽就会被调用。

一个信号可以连接到另外的一个信号

        当第一个信号发出时,第二个信号被发出。除此之外,这种信号-信号的形式和信号-槽的形式没有什么区别。

槽可以被取消链接

        这种情况并不经常出现,因为当一个对象 delete 之后,Qt 自动取消所有连接到这个对象上面的槽。

信号槽可以断开

        利用 disconnect 关键字是可以断开信号槽的

使用 Lambda 表达式

        在使用 Qt 5的时候,能够支持 Qt 5的编译器都是支持 Lambda 表达式的。在连接信号和槽的时候,槽函数可以使用 Lambda 表达式的方式进行处理。

lambda表达式

lambda表达式用于定义并创建匿名的函数对象,以简化编程工作

#include "widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent): QWidget(parent)
{b = new QPushButton("点击",this);int a = 10;//槽函数可以是一个lambda表达式//lambda表达式中[]写=,代表将上面的函数的局部变量以值传递的方式传入表达式//lambda表达式中[]写&,代表将上面的函数的局部变量以引用的方式传入表达式//lambda表达式中[]写a,代表将上面的函数的局部变量a以值传递的方式传入表达式//lambda表达式中[]写a,b,代表将上面的函数的局部变量a和b以值传递的方式传入表达式//lambda表达式中[]写&a,代表将上面的函数的局部变量a以引用的方式传入表达式//mutable修饰的作用是可以修改传入lambda中的值//->代表lambda返回值的类型是intconnect(b,&QPushButton::clicked,this,[=]()mutable->{qDebug()<<a;qDebug()<<"点击成功";});
}Widget::~Widget()
{}

相关文章:

QT信号槽

目录 信号槽的概念 按钮的常用信号 自定义槽函数 自定义信号函数 自定义槽和信号注意的事项 信号与槽的拓展 lambda表达式 信号槽的概念 信号槽是Qt框架引以为豪的机制之一。所谓信号槽&#xff0c;实际就是观察者模式。当某个事件发生之后&#xff0c;比如&#xff0c…...

Spring Boot 技术架构图(InsCode AI 创作助手辅助)

Spring Boot 技术架构是一种用于构建现代应用程序的框架&#xff0c;它可以与各种前端、代理、网关、业务服务、中间件、存储、持续集成和容器服务集成在一起&#xff0c;以创建功能强大的应用程序。 源文件下载链接&#xff01;&#xff01;&#xff01;&#xff01;&#xff…...

python使用mitmproxy和mitmdump抓包在手机上抓包(三)

现在手机的使用率远超过电脑&#xff0c;所以这篇记录用mitmproxy抓手机包&#xff0c;实现手机流量监控。 环境&#xff1a;win10 64位&#xff0c;Python 3.10.4&#xff0c;雷电模拟器4.0.78&#xff0c;android版本7.1.2&#xff08;设置-拉至最底部-关于平板电脑&#xf…...

react create-react-app v5 从零搭建(使用 npm run eject)

前言&#xff1a; 好久没用 create-react-app做项目了&#xff0c;这次为了个h5项目&#xff0c;就几个页面&#xff0c;决定自己搭建一个&#xff08;ps:mmp 好久没用&#xff0c;搭建的时候遇到一堆问题&#xff09;。 我之前都是使用 umi 。后台管理系统的项目 使用 antd-…...

在微信小程序中跳转到另一个小程序(多种实现方式)

方式一&#xff1a; 配置要跳转的appid和小程序页面路径 wx.navigateToMiniProgram({appId: 目标小程序appid,path: 目标小程序页面路径,//develop开发版&#xff1b;trial体验版&#xff1b;release正式版envVersion: release, success(res) {// 打开成功console.log("跳…...

beanstalkd 启动跟停止【经常使用 nohup 和 配合来启动程序,如: nohup ./test 同时免疫SIGINT和SIGHUP信号】

启动命令&#xff1a;  nohup /usr/bin/beanstalkd -l 0.0.0.0 -p 11300 & >> /dev/null 2>&1 正常启动后&#xff0c;利用 【lsof -i:11300】查看 该服务是否正常启动 停止命令&#xff1a; /etc/init.d/beanstalkd stop 正常停止后&#xff0c;利用 【l…...

企业年报API的应用:从金融投资到市场研究

引言 在数字化时代&#xff0c;企业年报不再仅仅是一份财务报告&#xff0c;它们变成了宝贵的信息资源&#xff0c;可用于各种商业应用。企业年报API已经改变了金融投资和市场研究的方式&#xff0c;使得从中获取数据变得更加高效和灵活。本文将深入探讨企业年报API的应用&…...

基于Matlab实现评价型模型求解方法(附上源码+数据)

评价型模型求解方法是一种用于评估和比较不同方案或决策的方法。本文将介绍如何使用Matlab来实现评价型模型求解方法&#xff0c;并通过一个简单的案例研究来说明其应用。 文章目录 引言方法案例研究结果分析结论更多源码 引言 评价型模型求解方法在决策分析、风险评估和性能…...

Prettier - Code formatter格式化规则文件

文章目录 前言安装使用 前言 先前公司在规范代码时,由于个人业务繁忙跟技术总监是后端出身用的IDEA不熟悉vsCode;以及大多数时都自己一个人负责一个项目,当时并不看重这些;最近在整理vue3tsvite的脚手架模板(平时工作用的react),开始整理格式化代码,方便之后 vue 和 react 中应…...

用C++实现文件读写操作

文件读写操作是C编程中非常常见的操作之一。下面是一个简单的示例&#xff0c;演示如何使用C读取和写入文件。 读取文件&#xff1a; #include <iostream> #include <fstream>int main() {std::ifstream inputFile("input.txt");if (!inputFile) {std:…...

【我的创作纪念日】使用pix2pixgan实现barts2020数据集的处理(完整版本)

使用pix2pixgan &#xff08;pytorch)实现T1 -> T2的基本代码 使用 https://github.com/eriklindernoren/PyTorch-GAN/ 这里面的pix2pixgan代码进行实现。 进去之后我们需要重新处理数据集&#xff0c;并且源代码里面先训练的生成器&#xff0c;后训练鉴别器。 一般情况下…...

背包算法(Knapsack problem)

背包算法&#xff08;Knapsack problem&#xff09;是一种常见的动态规划问题&#xff0c;它的基本思想是利用动态规划思想求解给定重量和价值下的最优解。具体来说&#xff0c;背包算法用于解决一个整数背包问题&#xff0c;即给定一组物品&#xff0c;每个物品有自己的重量和…...

“童”趣迎国庆 安全“童”行-柿铺梁坡社区开展迎国庆活动

“金秋十月好心境&#xff0c;举国欢腾迎国庆。”国庆节来临之际&#xff0c;为进一步加强梁坡社区未成年人爱国主义教育&#xff0c;丰富文化生活&#xff0c;营造热烈喜庆、文明和谐的节日氛围。9月24日上午&#xff0c;樊城区柿铺街道梁坡社区新时代文明实践站联合襄阳市和时…...

常用压缩解压缩命令

在Linux中常见的压缩格式有.zip、.rar、.tar.gz.、tar.bz2等压缩格式。不同的压缩格式需要用不同的压缩命令和工具。须知&#xff0c;在Linux系统中.tar.gz为标准格式的压缩和解压缩格式&#xff0c;因此本文也会着重讲解tar.gz格式压缩包的压缩和解压缩命令。须知&#xff0c;…...

第四十一章 持久对象和SQL - Storage

文章目录 第四十一章 持久对象和SQL - StorageStorage存储定义概览持久类使用的Globals注意 第四十一章 持久对象和SQL - Storage Storage 每个持久类定义都包含描述类属性如何映射到实际存储它们的Global的信息。类编译器为类生成此信息&#xff0c;并在修改和重新编译时更新…...

【Java接口性能优化】skywalking使用

skywalking使用 提示&#xff1a;微服务中-skywalking使用 文章目录 skywalking使用一、进入skywalking主页二、进入具体服务1.查看接口 一、进入skywalking主页 二、进入具体服务 可以点击列表或搜索后&#xff0c;点击进入具体服务 依次选择日期、小时、分钟 1.查看接口 依次…...

大学各个专业介绍

计算机类 五米高考-计算机类 注&#xff1a;此处平均薪酬为毕业五年平均薪酬&#xff0c;薪酬数据仅供参考 来源&#xff1a; 掌上高考 电气类 五米高考-电气类 机械类 五米高考-机械类 电子信息类 五米高考-电子信息类 土木类 五米高考-土木类...

linux 列出网络上所有活动的主机

列出网络上所有活动的主机 #!/bin/bash# {start..end}会由shell对其进行扩展生成一组ip地址for ip in 192.168.0.{1..255} ;do ping $ip -c 2 &> /dev/null ; # $?获取退出状态&#xff0c;顺利退出则为0 if [ $? -eq 0 ]; then echo $ip is alive fidone https://zh…...

基于vue+Element Table Popover 弹出框内置表格的封装

文章目录 项目场景&#xff1a;实现效果认识组件代码效果分析 封装&#xff1a;代码封装思路页面中使用 项目场景&#xff1a; 在选择数据的时候需要在已选择的数据中对比选择&#xff0c;具体就是点击一个按钮&#xff0c;弹出一个小的弹出框&#xff0c;但不像对话框那样还需…...

机器人过程自动化(RPA)入门 4. 数据处理

到目前为止,我们已经了解了RPA的基本知识,以及如何使用流程图或序列来组织工作流中的步骤。我们现在了解了UiPath组件,并对UiPath Studio有了全面的了解。我们用几个简单的例子制作了我们的第一个机器人。在我们继续之前,我们应该了解UiPath中的变量和数据操作。它与其他编…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...