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_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    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()));

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YOLO11改进 | 融合改进 | C3k2融合 Context Anchor Attention 【两个版本融合-独家创新】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 本文给大家带来的教程是将YOLO11的C3k2替…

机械制造工控自动化监控界面:功能与美观兼具

机械制造工控自动化监控界面需做到功能与美观兼具。在功能方面&#xff0c;清晰展示设备运行状态、参数指标等关键信息&#xff0c;提供实时监控和预警功能&#xff0c;确保生产安全高效。 界面布局应合理&#xff0c;操作简便&#xff0c;便于工作人员快速掌握和操作。而在美…

SpringBoot项目集成ONLYOFFICE

ONLYOFFICE 文档8.2版本已发布&#xff1a;PDF 协作编辑、改进界面、性能优化、表格中的 RTL 支持等更新 文章目录 前言ONLYOFFICE 产品简介功能与特点Spring Boot 项目中集成 OnlyOffice1. 环境准备2. 部署OnlyOffice Document Server3. 配置Spring Boot项目4. 实现文档编辑功…

explain执行计划分析 ref_

这里写目录标题 什么是ExplainExplain命令扩展explain extendedexplain partitions 两点重要提示本文示例使用的数据库表Explain命令(关键字)explain简单示例explain结果列说明【id列】【select_type列】【table列】【type列】 【possible_keys列】【key列】【key_len列】【ref…

AIDOVECL数据集:包含超过15000张AI生成的车辆图像数据集,目的解决旨在解决眼水平分类和定位问题。

2024-11-01&#xff0c;由伊利诺伊大学厄巴纳-香槟分校的研究团队创建的AIDOVECL数据集&#xff0c;通过AI生成的车辆图像&#xff0c;显著减少了手动标注工作&#xff0c;为自动驾驶、城市规划和环境监测等领域提供了丰富的眼水平车辆图像资源。 数据集地址&#xff1a;AIDOV…

24/11/7 算法笔记 PCA主成分分析

假如我们的数据集是n维的&#xff0c;共有m个数据(x,x,...,x)。我们希望将这m个数据的维度从n维降到k维&#xff0c;希望这m个k维的数据集尽可能的代表原始数据集。我们知道数据从n维降到k维肯定会有损失&#xff0c;但是我们希望损失尽可能的小。那么如何让这k维的数据尽可能表…

2-142【软件无线电原理与应用作业】基于matlab的圆形阵列的波束形成进行仿真

【软件无线电原理与应用作业】基于matlab的圆形阵列的波束形成进行仿真&#xff0c;具有14页文档。假设发射信号载频为1GHz&#xff0c;圆形阵列半径为0.8米&#xff0c;在圆周上均匀布置30个阵元。1.画出指向0度的方向图。2.如果目标在0度&#xff0c;有一不相干的干扰信号在3…

<项目代码>YOLOv8 苹果腐烂识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

python练习相关代码

一元二次方程的求根公式为&#xff1a; import mathdef quadratic(a, b, c):discriminant b**2 - 4*a*cif discriminant < 0:return Noneelif discriminant 0:return [-b / (2*a)]else:root1 (-b math.sqrt(discriminant)) / (2*a)root2 (-b - math.sqrt(discriminant)…

2024软件测试面试热点问题

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 大厂面试热点问题 1、测试人员需要何时参加需求分析&#xff1f; 如果条件循序 原则上来说 是越早介入需求分析越好 因为测试人员对需求理解越深刻 对测试工…

windows、linux安装jmeter及设置中文显示

系列文章目录 1.windows、linux安装jmeter及设置中文显示 2.jmeter常用配置元件介绍总结之安装插件 3.jmeter常用配置元件介绍总结之取样器 windows、linux安装jmeter及设置中文显示 前言一、jdk安装1.windows安装jdk1.1.复制环境变量快捷跳转 2.linux安装jdk 二、下载安装jmet…

各种数据库介绍

1. 关系型数据库&#xff08;RDBMS&#xff09; MySQL • 特点&#xff1a;开源、免费&#xff0c;社区版功能强大且稳定。支持大量的并发连接&#xff0c;常用于Web应用。 • 适用场景&#xff1a;中小型网站、博客、电商等。 PostgreSQL • 特点&#xff1a;功能丰富&#xf…

【linux】查看不同网络命名空间的端口

在部署harbor时&#xff0c;内部用的是数据库postgresql&#xff0c;端口默认是: 5432&#xff0c;一开始以为这个数据库docker容器是在本命名空间中&#xff0c;一直用ss -lnt查询系统的端口&#xff0c;找不到5432端口。但是harbor要能正常使用&#xff0c;所有怀疑harbor的容…

使用ffmpeg和mediamtx模拟多通道rtsp相机

首先下载ffmpeg&#xff0c;在windows系统上直接下载可执行文件&#xff0c;并配置环境变量即可在命令行当中调用执行。 下载地址&#xff1a; https://ffmpeg.org/再在github上下载mediamtx搭建rtsp服务器&#xff0c;使用ffmpeg将码流推流到rtsp服务器。 下载地址&#xff1…

大数据分库分表方案

分库分表介绍 分库分表应用场景 分库分表介绍 大数据分库分表是一种数据库架构技术&#xff0c;旨在应对大数据量场景下的数据库性能瓶颈。以下是对大数据分库分表的详细解释&#xff1a; 一、定义与背景 定义&#xff1a; 分库&#xff1a;将一个大型数据库按照一定的规则…

关于word 页眉页脚的一些小问题

去掉页眉底纹&#xff1a; 对文档的段落边框和底纹进行设置&#xff0c;也是页眉横线怎么删除的一种解决方式&#xff0c;具体操作如下&#xff1a; 选中页眉中的横线文本&#xff1b; 点击【开始】选项卡&#xff0c;在【段落】组中点击【边框】按钮的下拉箭头&#xff1b; …

爬虫-------字体反爬

目录 一、了解什么是字体加密 二. 定位字体位置 三. python处理字体 1. 工具库 2. 字体读取 3. 处理字体 案例1:起点 案例2:字符偏移: 5请求数据 - 发现偏移量 5.4 多套字体替换 套用模板 版本1 版本2 四.项目实战 1. 采集目标 2. 逆向结果 一、了解什么是…

Fortran安装(vscode+gcc+Python)

编写时间&#xff1a; 2024年11月7日 环境配置&#xff1a; gcc VScode Python 条件&#xff1a; Windows 10 x64 VMware虚拟机 前言 这是我出的第2个关于Fortran安装的教程&#xff0c;由于上一个方法&#xff08;你可以在本专栏里找到&#xff09;对储存空间的要求比较…

外包干了2年,快要废了。。。

先说一下自己的情况&#xff0c;普通本科毕业&#xff0c;在外包干了2年多的功能测试&#xff0c;这几年因为大环境不好&#xff0c;我整个人心惊胆战的&#xff0c;怕自己卷铺盖走人了&#xff0c;我感觉自己不能够在这样蹉跎下去了&#xff0c;长时间呆在一个舒适的环境真的会…

丹摩征文活动|详解 DAMODEL(丹摩智算)平台:为 AI 开发者量身打造的智算云服务

本文 什么是 DAMODEL&#xff08;丹摩智算&#xff09;&#xff1f;DAMODEL 的平台特性快速上手 DAMODEL 平台GPU 实例概览创建 GPU 云实例 储存选项技术支持与社区服务结语 在人工智能领域的飞速发展中&#xff0c;计算资源与平台的选择变得尤为重要。为了帮助 AI 开发者解决高…