QT信号和槽与自定义的信号和槽

QT信号和槽与自定义的信号和槽

1.概述

这篇文章介绍下QT信号和槽的入门知识,通过一个案例介绍如何创建信号和槽,并调用他们。

2.信号和槽使用

下面通过点击按钮关闭窗口的案例介绍如何使用信号和槽。

  1. 创建按钮
    在widget.cpp文件中创建按钮代码如下
#include "mywidget.h"
#include <QPushButton>Widget::Widget(QWidget *parent): QWidget(parent)
{//    第二种创建按钮方式QPushButton *btn2 = new QPushButton("构造按钮",this);
  1. 使用信号和槽实现点击按钮关闭窗口
    使用QObject类中的connect函数连接信号和槽,该函数需要4个参数
    • 参数1: 发送者,谁发送信号——btn2
    • 参数2: 发送的是什么信号,信号用函数地址——&QPushButton::clicked
    • 参数3: 接受者,谁来接受信号——this指的是当前窗口对象
    • 参数4: 槽,接受者做出的动作——&QWidget::close
connect(btn2, &QPushButton::clicked, this, &QWidget::close);

3.如何查看QT提供的信号和槽函数
在使用connect连接信号和槽的时候,第一个参数发送者是btn2按钮对象,属于QPushButton类。

如何查看系统提供的信号?
第二个参数需要知道发送什么信号,这个时候怎么知道QPushButton提供了哪些信号那,这就需要查看QT帮助文档。
首先在编辑器中点击HELP 打开帮助文档,输入QPush查看QPushButton中提供的内容没有Signal 信号。
在这里插入图片描述
接着查看QPushButton父类
在这里插入图片描述
在父类中看到有Signals 信号,点击它,跳转到信号介绍位置。
在这里插入图片描述
在信号介绍中给出了所有的信号,我们选择第一个就是我们示例中的点击信号。在使用这个信号函数时候一定要用地址引用方式调用它,就是在调用前加上&符号。

connect(btn2, &QPushButton::clicked, this, &QWidget::close);

在这里插入图片描述

如何查看系统提供的槽?
查看方法和上面查看信号一样,我们是关闭窗口,窗口的类是QWidge ,查看它的槽中提供了close() 函数。

connect(btn2, &QPushButton::clicked, this, &QWidget::close);

在这里插入图片描述

3.自定义信号和槽功能

上面介绍的是使用QT提供的信号和槽,下面通过一个实例介绍如何自定义自己的信号和槽的功能。
示例功能描述

老师类发出一个下课的信号,学生类的槽执行请客吃饭

  1. 新建项目

首先新建一个QWidge类型项目,然后在项目名称上右键,新建clss文件,名称输入
Teacher 。然后再新建另一个class文件,名称输入Student
在这里插入图片描述
2. 创建信号
teacher.h文件中创建信号, 信号只需要定义不需要实现。

#ifndef TEACHER_H
#define TEACHER_H#include <QObject>class Teacher : public QObject
{Q_OBJECT
public:explicit Teacher(QObject *parent = nullptr);signals:/* 自定义信号,写到signals中* 返回值是void,只需要声明不需要实现* 可以有参数,可以重载*/void hungry();};#endif // TEACHER_H
  1. 创造槽
    student.h文件中创建槽函数,槽函数声明后需要在student.cpp文件中实现功能。
#ifndef STUDENT_H
#define STUDENT_H#include <QObject>class Student : public QObject
{Q_OBJECT
public:explicit Student(QObject *parent = nullptr);signals:public slots:/* 早起QT版本,必须写到public slots, 高级版本可以写到public或者全局中* 返回值void, 需要声明并且实现* 可以有参数,可以重载
*/void treat();};#endif // STUDENT_H

student.cpp文件中实现功能

#include "student.h"
#include <QDebug>Student::Student(QObject *parent) : QObject(parent)
{}void Student::treat()
{qDebug() << "执行槽函数,请客吃饭";
}
  1. 连接信号和槽
    QWidget.h 文件中创建Teacher和Student类对象,创建一个触发下课的函数。
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include "teacher.h"
#include "student.h"QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
//    创建Teacher和Student类对象Teacher *tc;Student *st;private:Ui::Widget *ui;
//    创建一个触发下课的函数void classIsDown();
};
#endif // WIDGET_H

QWidget.cpp 文件中实现信号和槽的功能

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//    1.创建对象this->tc = new Teacher(this);this->st = new Student(this);
//    2.连接信号和槽connect(tc, &Teacher::hungry, st, &Student::treat);
//    3.调用触发下课函数classIsDown();
}//4.下课函数使用emit发送信号
void Widget::classIsDown()
{emit tc->hungry();
}
Widget::~Widget()
{delete ui;
}

4.信号和槽函数重载

当我们自定义信号和槽函数时,他们可以通过参数进行重载,实现更多的功能。当使用重载时,调用的时候需要使用函数指针指向函数地址,确认调用哪个重载的函数。
继续使用上面的示例,在Teacher和Student类中添加重载的信号和槽

  1. 添加重载的信号
    在teacher.h文件中新增void hungry(QString foodName); 有参的信号
#ifndef TEACHER_H
#define TEACHER_H#include <QObject>class Teacher : public QObject
{Q_OBJECT
public:explicit Teacher(QObject *parent = nullptr);signals:/* 自定义信号,写到signals中* 返回值是void,只需要声明不需要实现* 可以有参数,可以重载*/void hungry();
//    信号参数重载void hungry(QString foodName);};#endif // TEACHER_H
  1. 添加重载的槽
    在student.h文件中添加void treat(QString foodName); 槽函数
#ifndef STUDENT_H
#define STUDENT_H#include <QObject>class Student : public QObject
{Q_OBJECT
public:explicit Student(QObject *parent = nullptr);signals:public slots:/* 早起QT版本,必须写到public slots, 高级版本可以写到public或者全局中* 返回值void, 需要声明并且实现* 可以有参数,可以重载
*/void treat();//    槽参数重载void treat(QString foodName);};#endif // STUDENT_H

在student.cpp文件中实现槽函数功能

#include "student.h"
#include <QDebug>Student::Student(QObject *parent) : QObject(parent)
{}void Student::treat()
{qDebug() << "执行槽函数,请客吃饭";
}void Student::treat(QString foodName)
{qDebug() << "执行参数重载的槽函数,吃" << foodName.toUtf8().data();
}
  1. 调用重载的信号和槽函数
    在widget.cpp文件中通过connect()函数调用信号和槽之前需要先指明调用的是有参的信号和槽函数,方法如下
//    调用有参的信号和槽
//    1.声明一个函数指针,指向函数地址void(Teacher::*teacherSignal) (QString) = &Teacher::hungry;void(Student::*studentSlot)(QString) = &Student::treat;
//    2.连接信号和槽connect(tc, teacherSignal, st, studentSlot);

完整代码

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//    1.创建对象this->tc = new Teacher(this);this->st = new Student(this);
//    2.连接信号和槽
//    connect(tc, &Teacher::hungry, st, &Student::treat);
//    3.调用触发下课函数
//    classIsDown();//    调用有参的信号和槽
//    1.声明一个函数指针,指向函数地址void(Teacher::*teacherSignal) (QString) = &Teacher::hungry;void(Student::*studentSlot)(QString) = &Student::treat;
//    2.连接信号和槽connect(tc, teacherSignal, st, studentSlot);
//    3.调用触发下课函数classIsDown();
}//4.下课函数使用emit发送信号
void Widget::classIsDown()
{
//    调用无参信号
//    emit tc->hungry();
//    调用有参信号emit tc->hungry("糖醋里脊");
}
Widget::~Widget()
{delete ui;
}

5.信号连接信号

上面触发信号使用的是emit,如果我们想实现通过点击按钮来触发信号,那么可以采用普通的按钮发送信号控制槽函数,还可以采用信号连接信号实现。

//    点击按钮触发下课,第一种方式通过信号和槽实现。QPushButton *btn = new QPushButton("下课",this);this->resize(600,400);
//    connect(btn, &QPushButton::clicked, this, &Widget::classIsDown);//    点击按钮触发下课,第二种通过信号连接信号实现void(Teacher::*teacherSignal2) (void) = &Teacher::hungry;void(Student::*studentSlot2)(void) = &Student::treat;connect(tc, teacherSignal2, st, studentSlot2);//    通过一个按钮信号,链接到上面Teacher的信号,触发上面的信号和槽执行
//    当点击按钮时,按钮发送信号给teacher的信号,teacher信号被触发就会发送信号给student槽函数connect(btn, &QPushButton::clicked, tc, teacherSignal2);

6.断开信号

使用disconnect函数断开信号,函数中的参数就是要断开链接connect里面的参数。

//    点击按钮触发下课,第二种通过信号连接信号实现void(Teacher::*teacherSignal2) (void) = &Teacher::hungry;void(Student::*studentSlot2)(void) = &Student::treat;connect(tc, teacherSignal2, st, studentSlot2);//    通过一个按钮信号,链接到上面Teacher的信号,触发上面的信号和槽执行connect(btn, &QPushButton::clicked, tc, teacherSignal2);//    断开信号disconnect(tc, teacherSignal2, st, studentSlot2);

7.扩展

  1. QT4版本信号和槽写法
//    QT4版本信号和槽connect(tc,SIGNAL(hungry()), st, SLOT(treat()));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/59958.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unity显示获取 年月日周几【日期】

unity显示获取 年月日周几【日期】 public void ShowDate(Text txt){//txt.text DateTime now DateTime.Now; // 获取当前时间int year now.Year; // 获取年份int month now.Month; // 获取月份&#xff08;1-12&#xff09;int day now.Day; // 获取天数&#xff08;1-31&…

emr上使用sparkrunner运行beam数据流水线

参考资料 https://time.geekbang.org/column/intro/167?tabcatalog Apache Beam和其他开源项目不太一样&#xff0c;它并不是一个数据处理平台&#xff0c;本身也无法对数据进行处理。Beam所提供的是一个统一的编程模型思想&#xff0c;而我们可以通过这个统一出来的接口来编…

AUTOSAR CP SocketAdaptor(SoAd)规范导读

《AUTOSAR_SWS_SocketAdaptor》规范的主要内容包括&#xff1a; 简介和功能概述&#xff1a;说明了 AUTOSAR 基本软件模块 Socket Adaptor&#xff08;SoAd&#xff09;的功能、API 和配置。数据传输的 TCP/IP 概念在计算和电信环境中已成为标准&#xff0c;应用程序的寻址等…

代码随想录-栈和队列-用栈实现队列

问题描述 题目描述中有说不存在空栈的pop和peek&#xff0c;所以无需判断这个 解析 重点在于思路&#xff0c;代码白给。 要用栈实现队列&#xff0c;肯定是两个栈才可以。一个做入队操作&#xff0c;一个做出队操作。 首先入队简单&#xff0c;往栈里加就完事了。 出队复…

【设计模式】结构型模式(四):组合模式、享元模式

《设计模式之结构型模式》系列&#xff0c;共包含以下文章&#xff1a; 结构型模式&#xff08;一&#xff09;&#xff1a;适配器模式、装饰器模式结构型模式&#xff08;二&#xff09;&#xff1a;代理模式结构型模式&#xff08;三&#xff09;&#xff1a;桥接模式、外观…

轻型民用无人驾驶航空器安全操控------理论考试多旋翼部分笔记

官网&#xff1a;民用无人驾驶航空器综合管理平台 (caac.gov.cn) 说明&#xff1a;一是法规部分&#xff1b;二是多旋翼部分 本笔记全部来源于轻型民用无人驾驶航空器安全操控视频讲解平台 目录 官网&#xff1a;民用无人驾驶航空器综合管理平台 (caac.gov.cn) 一、轻型民用无人…

【leetcode练习·二叉树】用「分解问题」思维解题 I

本文参考labuladong算法笔记[【强化练习】用「分解问题」思维解题 I | labuladong 的算法笔记] 105. 从前序与中序遍历序列构造二叉树 | 力扣 | LeetCode | 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵…

深入解析四种核心网络设备:集线器、桥接器、路由器和交换机

计算机网络系列课程《网络核心设备》 在现代网络技术中&#xff0c;集线器、桥接器、路由器和交换机扮演着至关重要的角色。本文&#xff0c;将深入探讨这四种设备的功能、工作原理及其在网络架构中的重要性。 集线器&#xff1a;基础网络连接设备 集线器&#xff08;Hub&…

宏景eHR uploadLogo.do 任意文件上传致RCE漏洞复现

0x01 产品简介 宏景eHR人力资源管理软件是一款专为复杂单组织或多组织客户设计的人力资源管理软件,融合了最新的互联网技术和先进的人力资源管理理念和实践。宏景eHR软件支持B/S架构,特别适合集团化管理和跨地域使用。它提供了全面的人力资源管理功能,包括人员、组织机构、…

ssm基于JAVA的网上订餐管理系统+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码看文章最下面 需要定制看文章最下面 目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容…

NVR设备ONVIF接入平台EasyCVR私有化部署视频平台如何安装欧拉OpenEuler 20.3 MySQL

在当今数字化时代&#xff0c;安防视频监控系统已成为保障公共安全和个人财产安全的重要工具。NVR设备ONVIF接入平台EasyCVR作为一款功能强大的智能视频监控管理平台&#xff0c;它不仅提供了视频远程监控、录像、存储与回放等基础功能&#xff0c;还涵盖了视频转码、视频快照、…

测试网空投进行中 — 全面了解 DePIN 赛道潜力项目 ICN Protocol 及其不可错过的早期红利

随着云计算技术的飞速发展&#xff0c;越来越多的企业和个人对云服务的需求变得多样化且复杂化。然而&#xff0c;传统的中心化云服务平台&#xff08;如AWS、微软Azure等&#xff09;往往存在着高成本、数据隐私保护不足以及灵活性差等问题。 为了解决这些挑战&#xff0c;Imp…

CulturalBench :一个旨在评估大型语言模型在全球不同文化背景下知识掌握情况的基准测试数据集

2024-10-04&#xff0c;为了提升大型语言模型在不同文化背景下的实用性&#xff0c;华盛顿大学、艾伦人工智能研究所等机构联合创建了CulturalBench。这个数据集包含1,227个由人类编写和验证的问题&#xff0c;覆盖了包括被边缘化地区在内的45个全球区域。CulturalBench的推出&…

CAD VBA 图元颜色跟随图层

效果如下&#xff1a; 一、所有图元颜色为bylayer Sub 图元颜色跟随图层() Dim item As AcadEntityFor Each item In ThisDrawing.ModelSpace item.color acByLayer Next ThisDrawing.Regen acActiveViewport End Sub二、与图层颜色相同&#xff08;不是bylayer&#xff09;:…

介绍一下数组(c基础)(smart 版)

c初期&#xff0c;记住规则&#xff0c;用规则。 我只是介绍规则。&#xff08;有详细版&#xff0c;这适合smart人看&#xff09; 数组&#xff08;同类型&#xff09; int arr[n] {} ; int 是 元素类型。 int arr[n] {} ; arr为标识符。 {} 集合&#xff0c;元素有次…

【数据结构】插入排序——直接插入排序 和 希尔排序

直接插入排序 和 希尔排序 一、直接插入排序二、直接插入排序的弊端三、希尔排序&#xff08;1&#xff09;对插入排序的联想&#xff08;2&#xff09;希尔排序的思路 四、直接插入排序和希尔排序效率对比1>随机生成10000个数2>我们随机生成100000个数3>我们随机生成…

python使用turtle画图快速入门,轻松完成作业练习

turtle介绍 turtle是一个绘图库&#xff0c;可以通过编程进行绘图。其模拟了一个乌龟在屏幕上的运动过程。该库通常用于给青少年学习编程&#xff0c;当然&#xff0c;也可以使用其进行作图。 在一些学校中&#xff0c;可能在python学习的课程中&#xff0c;要求完成turtle绘…

K8S群集调度二

一、污点(Taint) 和 容忍(Tolerations) 1.1、污点(Taint) 设置在node上是对pod的一种作用 节点的亲和性&#xff0c;是Pod的一种属性&#xff08;偏好或硬性要求&#xff09;&#xff0c;它使Pod被吸引到一类特定的节点 而Taint 则相反&#xff0c;它使节点能够排斥一类特…

分布式唯一ID生成(二): leaf

文章目录 本系列前言号段模式双buffer优化biz优化动态step源码走读 雪花算法怎么设置workerId解决时钟回拨源码走读 总结 本系列 漫谈分布式唯一ID分布式唯一ID生成&#xff08;二&#xff09;&#xff1a;leaf&#xff08;本文&#xff09;分布式唯一ID生成&#xff08;三&am…

MVDR:最小方差无失真响应技术解析

目录 什么是MVDR&#xff1f;MVDR的工作原理主要步骤MVDR的应用场景MVDR的优势与挑战结论 什么是MVDR&#xff1f; MVDR&#xff08;Minimum Variance Distortionless Response&#xff0c;最小方差无失真响应&#xff09;是一种用于信号处理中的自适应滤波技术&#xff0c;广…