当前位置: 首页 > 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;即它不会跨层级比较节…...

WSL 2 中 FastReport 与 FastCube 的设置方法与优化策略

软件开发人员长期以来一直在思考这个问题&#xff1a;“我们如何才能直接在 Windows 中运行 Linux 应用程序&#xff0c;而无需使用单独的虚拟机&#xff1f;” WSL 技术为这个问题提供了一个可能的答案。WSL 的历史始于 2016 年。当时&#xff0c;其实现涉及使用 Windows 内核…...

《线性代数》学习笔记

列向量无关 上个星期继续学线性代数&#xff0c;一个矩阵&#xff0c;如何判断它是的列向量有几个是线性无关呢&#xff1f;其实有好几个方法。第一个就是一个一个判断。 先选定一个&#xff0c;然后看下这两个&#xff0c;怎么看呢&#xff1f;如果两个列向量线性相关&#…...

Redis三种集群模式:主从模式、哨兵模式和Cluster模式

目录标题 1、背景及介绍2、 Redis 主从复制2.1、主从复制特点2.2、Redis主从复制原理2.3 PSYNC 工作原理2.3.1、启动或重连判断&#xff1a;2.3.2、第一次同步处理&#xff1a;2.3.3、断线重连处理&#xff1a;2.3.4、主节点响应2.3.5、全量同步触发条件&#xff1a;2.3.6、复制…...

CDH大数据平台部署

二、CDH简介 全称Cloudera’s Distribution Including Apache Hadoop。 hadoop的版本 (Apache、CDH、Hotonworks版本) 在公司中一般使用cdh多一些&#xff08;收费的&#xff09;、也有公司使用阿里云大数据平台、微软的大数据平台。 国内也有一些平台&#xff1a;星环大数…...

7.4、实验四:RIPv2 认证和触发式更新

源文件 一、引言&#xff1a;为什么要认证和采用触发式更新&#xff1f; 1. RIP v2 认证 RIP&#xff08;Routing Information Protocol&#xff09;版本 2 添加了认证功能&#xff0c;以提高网络的安全性。认证的作用主要包括以下几点&#xff1a; 防止路由欺骗 RIP v1 是不…...

【一步步开发AI运动小程序】二十一、如果将AI运动项目配置持久化到后端?

**说明&#xff1a;**本文所涉及的AI运动识别、计时、计数能力&#xff0c;都是基于云智「Ai运动识别引擎」实现。云智「Ai运动识别」插件识别引擎&#xff0c;可以为您的小程序或Uni APP赋于原生、本地、广覆盖、高性能的人体识别、姿态识别、10余种常见的运动计时、计数识别及…...

LED和QLED的区别

文章目录 1. 基础背光技术2. 量子点技术的引入3. 色彩表现4. 亮度和对比度5. 能效6. 寿命7. 价格总结 LED和 QLED都是基于液晶显示&#xff08;LCD&#xff09;技术的电视类型&#xff0c;但它们在显示技术、色彩表现和亮度方面有一些关键区别。以下是两者的详细区别&#xff…...

2024 年Postman 如何安装汉化中文版?

2024 年 Postman 的汉化中文版安装教程...

转化古老的Eclipse项目为使用gradle构建

很多古老的Java项目&#xff0c;是使用Eclipse作为IDE开发的。 那么&#xff0c;使用其它IDE的开发者&#xff0c;如何快速地进入这种古老项目的开发呢&#xff1f;或者说&#xff0c;一个Eclipse构建的古老项目&#xff0c;能不能转化成一个IDE无关的项目&#xff0c;进而所有…...

openGauss常见问题与故障处理(二)

2.网络故障定位手段 2.1 网络故障定位手段--常见网络故障引发的异常 在数据库正常工作的情况下&#xff0c;网络层对上层用户是透明的&#xff0c;但数据库在长期运行时&#xff0c;可能会由于各种原因导致出现网络异常或错误。 常见的因网络故障引发的异常有&#xff1a; 1>…...

wordpress 当前分类名称/郑州seo网站管理

原文:WPF 判断值是不是NaN经常要在StoryBoard用到的 判断方法&#xff1a; Double.IsNaN(你要判断的值&#xff09; true// NaN 否则就不是。...

网站开发 兼容模式/关键词快速排名seo怎么优化

好久没更新了&#xff0c;想起之前做的飞机大战 /*** Created by Administrator on 2019/6/22.*/ var playing (function(){var start;function setmap(){if(startundefined){start new game();}return start;}//游戏的主类function game(){}//将地图挂载给游戏game.prototy…...

互助盘网站开发/东莞网络营销优化

// 我们假设有一个QLabel 用来显示某某信息&#xff0c;但是信息有时候过长&#xff0c;高度超过了QLabel的高度// 这时候最好的方法是让其滚动&#xff0c;那么我们就来实现以下上下滚动。// 要用到的QT 事件 void showEvent(QShowEvent *);void paintEvent(QPaintEvent *);vo…...

木纹背景的精致wordpress企业主题/鞍山seo优化

为什么80%的码农都做不了架构师&#xff1f;>>> OSGi是一个语义框架。 本来是服务网关。 但是服务网关的出现勾起了人们改造它的欲望。想从中得到更多的东西。这说明人就是愚蠢的&#xff0c;不能从逻辑只能从欲望推出它的存在。另一方面&#xff0c;说明智能进化…...

电子商务网站总体框架设计/如何免费推广自己的网站

总结&#xff1a; 给你一串值&#xff0c;让你进行选择这串值中选择哪些值&#xff0c;不选择哪些值。 可以使用二进制的方式进行存储或者遍历。 比如&#xff1a; 1234 用1表示某个位置选&#xff0c;0表示某个位置不选。 如: 0110 , 就是1&#xff0c;4不选&#xff0c;2&am…...

iis怎么使用来建设一个网站/媒体软文发稿

Win服务控制程序--serConf.exe 前几天写一个windows服务管理程序&#xff0c;由于要做驱动开发了&#xff0c;但是对驱动程序进行安装加载测试时&#xff0c;大部分都使用服务的形式来启动它。 于是&#xff0c;自己就从网上下了几个安装驱动的服务控制程序&#xff0c;但是它们…...