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

Qt信号和槽-->day04

Qt信号和槽

  • 标准的信号和槽函数
    • Qt中的槽函数
    • Qt中的信号
  • connect
    • 案例
  • 自定义信号和槽
    • 案例分析
  • 信号槽的拓展
    • 信号连接信号案例
  • 信号槽的两种连接方式
    • Qt5中的处理方式
    • Qt4中的处理方式
    • Qt5处理信号槽重载问题
      • 案例
    • lambda表达式
      • 简单案例
      • Qt中的应用
  • 补充知识点

标准的信号和槽函数

QWidget标准的信号和槽函数
在这里插入图片描述
此外信号和槽函数是可以被继承的
在这里插入图片描述
可以看到QPushButton是有标准的槽函数,但是没有看到信号。
实际上QPushButton是继承了它的父类的信号
在这里插入图片描述

Qt中的槽函数

Qt中的槽函数可以是类的成员函数、全局函数、静态函数、Lambda表达式(匿名函数)

Qt中的信号

信号需要使用 signals 关键字进行声明, 使用方法类似于public等关键字

connect

connect(信号发生者,信号,信号接受者,接受者的处理动作);

connect只是做了一个信号注册,具体操作步骤是通过qt框架进行实现的

案例

功能实现: 点击窗口上的按钮, 关闭窗口
功能分析:
- 按钮: 信号发出者 -> QPushButton 类型
- 窗口: 信号的接收者和处理者 -> QWidget 类型
在这里插入图片描述

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
//  ui->closeBtn;//>>>>>>>>>>>>>>>>>>通过ui对象可以操纵所创建的按钮connect(ui->closeBtn,&QPushButton::clicked,this,&MainWindow::close);
}MainWindow::~MainWindow()
{delete ui;
}

不可以将第四个参数写为 &this->close,因为 &this->close 表示的是 MainWindow 类的成员函数指针,而 QPushButton::clicked 信号需要一个成员函数指针,而这个指针的类型是 void (MainWindow:😗)()(即没有参数且没有返回值的成员函数指针)。

自定义信号和槽

案例分析

假设要实现一个类GirlFriend发出hungry信号,一个类Me来接受信号进行处理。

  • 1、由于这两个是不同的类,所以应该提供一个窗口类对上面的这两个类进行包装
  • 2、在GirlFriend类中只需要声明信号,不需要实现,因为这是信号的发出者
  • 3、在Me类的槽函数不仅需要声明也需要实现

主窗口头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include "girlfriend.h"
#include "me.h"QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();public slots:void hungrySlot();private:Ui::MainWindow *ui;GirlFriend *g_girl;Me *m_me;
};
#endif // MAINWINDOW_H

主窗口函数实现

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
//  ui->closeBtn;//>>>>>>>>>>>>>>>>>>通过ui对象可以操纵所创建的按钮g_girl=new GirlFriend;m_me=new Me;//这个hungry是自定义的不由Qt框架提供,需要使用者发射信号 >>>>>>> 窗口中实现connect(g_girl,&GirlFriend::hungry,m_me,&Me::eat);//>>>>>>>>>>>>>>提醒Qt框架有信号connect(ui->hungry,&QPushButton::clicked,this,&MainWindow::hungrySlot);connect(ui->closeBtn,&QPushButton::clicked,this,&MainWindow::close);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::hungrySlot()
{//发射信号emit g_girl->hungry();
}

在这里插入图片描述

信号槽的拓展

  • 一个信号可以连接多个槽函数, 发送一个信号有多个处理动作
    需要写多个connect()连接
    槽函数的执行顺序是随机的, 和connect函数的调用顺序没有关系
  • 信号的接收者可以是一个对象, 也可以是多个对象
    一个槽函数可以连接多个信号, 多个不同的信号, 处理动作是相同的
    需要写多个connect()连接
  • 信号可以连接信号
connect(const QObject *sender, &QObject::signal, const QObject *receiver, &QObject::siganl-new);
  • 信号槽可以断开信号 --> 很少使用
disconnect(const QObject *sender, &QObject::signal, const QObject *receiver, &QObject::method);

信号连接信号案例

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
//  ui->closeBtn;//>>>>>>>>>>>>>>>>>>通过ui对象可以操纵所创建的按钮g_girl=new GirlFriend;m_me=new Me;//这个hungry是自定义的不由Qt框架提供connect(g_girl,&GirlFriend::hungry,m_me,&Me::eat);connect(g_girl,&GirlFriend::hungry,this,&MainWindow::eatSlot);//信号连接信号connect(ui->hungry,&QPushButton::clicked,g_girl,&GirlFriend::hungry);//信号连接槽函数//connect(ui->hungry,&QPushButton::clicked,this,&MainWindow::hungrySlot);connect(ui->closeBtn,&QPushButton::clicked,this,&MainWindow::close);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::hungrySlot()
{//发射信号emit g_girl->hungry();
}void MainWindow::eatSlot()
{qDebug()<<"喝尿";
}

在这里插入图片描述

信号槽的两种连接方式

Qt5中的处理方式

第二个和第四个参数是函数地址
在这里插入图片描述

Qt4中的处理方式

信号槽函数通过宏SIGNAL和SLOT转换为字符串类型
在这里插入图片描述

Qt5处理信号槽重载问题

signals:void hungry();void hungry(QString msg);
public slots://槽函数void eat();void eat(QString msg);

解决方案1:使用Qt4的信号与槽的机制(慎用,编译器不会报错如果你写错了)

    //Qt4的信号与槽connect(g_girl,SIGNAL(hungry()),m_me,SLOT(eat()));connect(g_girl,SIGNAL(hungry(QString)),m_me,SLOT(eat(QString)));

解决方案2:使用函数指针进行指定

    void(GirlFriend::*girl1)()=&GirlFriend::hungry;void(GirlFriend::*girl2)(QString)=&GirlFriend::hungry;void(Me::*point)(QString)=&Me::eat;void(Me::*pointt)()=&Me::eat;connect(g_girl,girl1,m_me,pointt);connect(g_girl,girl2,m_me,point);// >>>>> Qt5connect(g_girl,girl2,this,&MainWindow::eatSlot);// >>>>>> 信号是带参的而槽函数是不带参的 >>>> 直接就是执行eatSlot

案例

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
//  ui->closeBtn;//>>>>>>>>>>>>>>>>>>通过ui对象可以操纵所创建的按钮g_girl=new GirlFriend;m_me=new Me;//这个hungry是自定义的不由Qt框架提供
// >>>>>>>>>>>>>> Qt5处理重载void(GirlFriend::*girl1)()=&GirlFriend::hungry;void(GirlFriend::*girl2)(QString)=&GirlFriend::hungry;void(Me::*point)(QString)=&Me::eat;void(Me::*pointt)()=&Me::eat;connect(g_girl,girl1,m_me,pointt);connect(g_girl,girl2,m_me,point);// >>>>> Qt5connect(g_girl,girl2,this,&MainWindow::eatSlot);
//err//connect(g_girl,&GirlFriend::hungry,m_me,&Me::eat);// >>>>> Qt5//connect(g_girl,&GirlFriend::hungry,this,&MainWindow::eatSlot);//Qt4的信号与槽connect(g_girl,SIGNAL(hungry()),m_me,SLOT(eat()));connect(g_girl,SIGNAL(hungry(QString)),m_me,SLOT(eat(QString)));//信号连接信号//connect(ui->hungry,&QPushButton::clicked,g_girl,&GirlFriend::hungry);//信号连接槽函数connect(ui->hungry,&QPushButton::clicked,this,&MainWindow::hungrySlot);connect(ui->closeBtn,&QPushButton::clicked,this,&MainWindow::close);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::hungrySlot()
{//发射信号g_girl->hungry();g_girl->hungry("粑粑");
}void MainWindow::eatSlot()
{qDebug()<<"喝尿";
}

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

lambda表达式

lambda表达式–>匿名函数

[capture](params) opt -> ret {body;};- capture: 捕获列表- params: 参数列表- opt: 函数选项- ret: 返回值类型- body: 函数体
捕获列表: 捕获一定范围内的变量[] - 不捕捉任何变量[&] - 捕获外部作用域中所有变量, 并作为引用在函数体内使用 (按引用捕获)[=] - 捕获外部作用域中所有变量, 并作为副本在函数体内使用 (按值捕获)拷贝的副本在匿名函数体内部是只读的[=, &foo] - 按值捕获外部作用域中所有变量, 并按照引用捕获外部变量 foo[bar] - 按值捕获 bar 变量, 同时不捕获其他变量[&bar] - 按引用捕获 bar 变量, 同时不捕获其他变量[this] - 捕获当前类中的this指针让lambda表达式拥有和当前类成员函数同样的访问权限如果已经使用了 & 或者 =, 默认添加此选项

简单案例

// 匿名函数的定义, 程序执行这个匿名函数是不会被调用的
[](){qDebug() << "hello, 我是一个lambda表达式...";
};// 匿名函数的定义+调用:
int ret = [](int a) -> int
{return a+1;
}(100);  // 100是传递给匿名函数的参数

Qt中的应用

在这里插入图片描述

补充知识点

#include<iostream>
using namespace std;class a
{
public:void print(){cout << "1" << endl;}
};int main()
{a a;  // 创建对象a.print();// 声明成员函数指针并调用void (a:: * print_ptr)() = &a::print;  // 成员函数指针(a.*print_ptr)();  // 通过指针调用
}

在这里插入图片描述

相关文章:

Qt信号和槽-->day04

Qt信号和槽 标准的信号和槽函数Qt中的槽函数Qt中的信号 connect案例 自定义信号和槽案例分析 信号槽的拓展信号连接信号案例 信号槽的两种连接方式Qt5中的处理方式Qt4中的处理方式Qt5处理信号槽重载问题案例 lambda表达式简单案例Qt中的应用 补充知识点 标准的信号和槽函数 QW…...

【Linux】为终端命令自定义快件键并弹窗提醒 设置快捷键切换网络代理(Network Proxy)Disabled/Manual 并弹窗提醒

【Linux】为终端命令自定义快件键并弹窗提醒 设置快捷键切换网络代理&#xff08;Network Proxy&#xff09;Disabled/Manual 并弹窗提醒 可以自定义快捷键执行终端命令&#xff0c;执行完毕会有弹窗提醒。下面给一个例子&#xff0c;设置快捷键切换网络代理&#xff08;Netwo…...

十六:Spring Boot依赖 (1)-- spring-boot-starter 依赖详解

1. 简介&#xff1a; spring-boot-starter 是 Spring Boot 项目中的基础启动器依赖&#xff0c;它为开发者提供了 Spring Boot 应用所需的核心功能和自动配置 spring-boot-starter 不是一个具体的功能模块&#xff0c;而是一个基础的启动器。 Spring Boot 提供了一系列的 sta…...

讲讲关于SNMP与智能PDU插座

什么是SNMP 简单网络管理协议 (SNMP) 是一种应用层协议&#xff0c;主要用于网络管理中的设备监控和控制。通过 SNMP&#xff0c;网络管理员可以从管理站远程访问网络中的设备&#xff0c;获取设备的状态信息、配置参数&#xff0c;甚至控制设备的行为。SNMP 被广泛应用于 TCP/…...

在CentOS下安装RabbitMQ

在CentOS下安装RabbitMQ 在CentOS下安装RabbitMQ可以按照以下步骤进行&#xff1a;步骤 1: 更新系统步骤 2: 安装Erlang步骤 3: 添加RabbitMQ仓库步骤 4: 安装RabbitMQ步骤 5: 启动RabbitMQ服务步骤 6: 检查RabbitMQ状态步骤 7: 启用RabbitMQ管理插件&#xff08;可选&#xff…...

前端使用Canvas实现网页电子签名(兼容移动端和PC端)

实现效果&#xff1a; 要使用Canvas实现移动端网页电子签名&#xff0c;可以按照以下步骤&#xff1a; 在HTML文件中创建一个Canvas元素&#xff0c;并设置其宽度和高度&#xff0c;以适配移动设备的屏幕大小。 // 创建一个canvas元素 let canvas document.createElement(&q…...

什么是OSTRPT报文?

OSTRPT&#xff08;Order Status Report&#xff09;是一种 EDI&#xff08;电子数据交换&#xff09;报文&#xff0c;用于在供应链管理中向采购商报告订单状态。这种报文通常由供应商发送给采购商&#xff0c;目的是告知订单的当前处理状态、预期交货时间、订单中的变化等信息…...

PICO+Unity MR空间锚点

官方链接&#xff1a;空间锚点 | PICO 开发者平台 注意&#xff1a;该功能只能打包成APK在PICO 4 Ultra上真机运行&#xff0c;无法通过串流或PICO developer center在PC上运行。使用之前要开启视频透视。 在 Inspector 窗口中的 PXR_Manager (Script) 面板上&#xff0c;勾选…...

electron 中 contextBridge 作用

1. 安全地实现渲染进程和主进程之间的通信 在 Electron 应用中&#xff0c;主进程和渲染进程是相互隔离的&#xff0c;这是为了安全和稳定性考虑。 然而&#xff0c;在很多情况下&#xff0c;渲染进程需要访问主进程中的某些功能&#xff0c;例如系统级别的操作或者一些应用级…...

15分钟学 Go 第 42 天:RESTful API设计

第42天&#xff1a;RESTful API设计 目标&#xff1a;理解RESTful API的设计原则 在现代Web开发中&#xff0c;RESTful API&#xff08;Representational State Transfer&#xff09;已经成为了标准的架构风格&#xff0c;用于实现客户端与服务器之间的通信。通过遵循REST的设…...

如何安全的中断一个运行中的线程?

文心快码进入3.0时代&#xff0c; 最新发布的代码问答、编码、Debug、单测、安全智能体&#xff0c; 分别在开发的设计、编码、构建、测试验证全流程通过AI赋能&#xff0c;让效率更高、效果更好。可以通过自然语言对话&#xff0c;独立为你完成一项编码任务。 &#x1f449;点…...

【121. 买卖股票的最佳时机】——贪心算法/动态规划

121. 买卖股票的最佳时机 一、题目难度 简单 三、题目描述 给定一个数组 prices&#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择某一天买入这只股票&#xff0c;并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获…...

LLMs之Calculate:利用大语言模型技术基于文本内容实现数字计算能力的简介、常用方法、代码实现之详细攻略

LLMs之Calculate:利用大语言模型技术基于文本内容实现数字计算能力的简介、常用方法、代码实现之详细攻略 导读:在基于大语言模型(LLM)技术实现数字计算能力的背景下,文本内容的理解和计算过程涉及多个领域的交叉技术,包括自然语言处理(NLP)、机器学习、以及数值计算。…...

LeetCode题练习与总结:判断子序列--392

一、题目描述 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;"ace"是"abcde"的一…...

json数据结构的转换

# json可用于赌徒与原件数据的转换&#xff08;json以字符串的形式储存数据&#xff0c;在通过json进行两种语言的转换时&#xff0c;应先将数据类型转换成列表或字典&#xff0c;再由列表或字典转换成json字符串&#xff0c;最后由json字符串转换成另一种语言的列表或字典数据…...

mysql删除语句:@Update(“TRUNCATE TABLE employee“)讲解

这个 SQL 语句&#xff1a; TRUNCATE TABLE employee是一个 SQL DDL&#xff08;数据定义语言&#xff09; 操作&#xff0c;用于清空数据库表中的所有记录&#xff0c;但不会删除表结构&#xff08;即列和索引等&#xff09;。 逐部分解释&#xff1a; TRUNCATE&#xff1a;…...

如何修改浏览器指纹?

网络安全日益重要&#xff0c;我们的上网行为变得越来越容易被追踪和分析。其中&#xff0c;浏览器指纹就是一种强大的技术手段&#xff0c;它可以说是你上网的身份象征。 一、浏览器指纹是什么 浏览器指纹是网站和在线平台用来收集关于你的浏览器、设备和网络的详细信息的一…...

实现3D热力图

实现思路 首先是需要用canvas绘制一个2D的热力图&#xff0c;如果你还不会&#xff0c;请看json绘制热力图。使用Threejs中的canvas贴图&#xff0c;将贴图贴在PlaneGeometry平面上。使用着色器材质&#xff0c;更具json中的数据让平面模型 拔地而起。使用Threejs内置的TWEEN&…...

GEE ui界面实现:用户自画多边形, 按面积比例在多边形中自动生成样点,导出多边形和样点shp,以及删除上一组多边形和样点(有视频效果展示)

零、背景 这几天在选样点&#xff0c;发现GEE有强大的ui功能&#xff0c;于是应用在我的工作上。 下述代码实现了几个功能&#xff1a; ①用户可以自己勾勒多边形&#xff0c;随后程序会按面积比例在多边形中自动生成样点&#xff0c;同时根据改多边形的区域生成区域平均月N…...

React diff算法和Vue diff算法的主要区别

React和Vue都是流行的前端框架&#xff0c;它们各自实现了diff算法来优化虚拟DOM的更新过程。以下是React diff算法和Vue diff算法的主要区别&#xff1a; 1. diff策略 React diff算法&#xff1a; React的diff算法主要采用了同层级比较的策略&#xff0c;即它不会跨层级比较节…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...