Qt_自定义信号

news2024/11/12 15:50:39

目录

1、自定义信号的规定

2、创建自定义信号

3、带参数的信号与槽 

4、一个信号连接多个槽 

5、信号与槽的断开 

结语


前言:

        虽然Qt已经内置了大量的信号,并且这些信号能够满足大部分的开发场景,但是Qt仍然允许开发者自定义信号,给开发者提供了足够的DIY设计空间。

1、自定义信号的规定

        Qt中的信号实际上就是函数,因此自定义信号本质就是自定义函数,只不过自定义信号函数的写法要遵循以下三点:

        1、Qt提供了关键字“signals”,自定义信号函数必须写在 “signals” 关键字下边。

        2、自定义信号函数只需要声明,不需要实现,返回值要为void。

        3、自定义信号函数可以有形参,允许重载。

        当然,有了自定义信号函数后还需要拥有将该信号发出的能力,可以使用emit关键字修饰信号函数,表示发送该信号。"emit" 是⼀个空的宏。

2、创建自定义信号

        有了上述的规则后,可以手动创建一个自定义信号,并给该信号连接一个槽函数,槽函数内打印一条语句,运行代码后若输出窗口中打印出了语句说明自定义信号成功创建,具体代码如下。

        1、widget.h的代码如下:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

signals:
    void mySignal();//自定义信号

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    void Print();//槽函数声明

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

         2、widget.cpp的代码如下:

#include "widget.h"
#include "ui_widget.h"

#include <QDebug>
#include <QPushButton>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    connect(this,&Widget::mySignal,this,&Widget::Print);//连接信号与槽

    emit mySignal();//发送信号
}

Widget::~Widget()
{
    delete ui;
}

void Widget::Print()
{
    qDebug()<<"自定义信号调用的自定义槽函数";
}

        运行结果:

        从结果可以看到,槽函数里的语句被打印,说明自定义信号成功被触发且执行了对应的槽函数。 

3、带参数的信号与槽 

        Qt中的信号与槽在代码的层面上都是函数,既然是函数所以他们都可以有形参,不过严格规定信号的参数要与连接的槽的参数类型保持一致,信号的参数多于槽参数都是可以的。当发送该信号时,调用信号所传的实参会传给信号函数的形参,然年信号函数再传递给槽函数,示意图如下:

        代码实现如下,1、widget.h的代码如下:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

signals:
    void mySignal(QString s);//自定义信号

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    void Print(QString s);//槽函数声明

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

        2、widget.cpp的代码如下:

#include "widget.h"
#include "ui_widget.h"

#include <QDebug>
#include <QPushButton>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    connect(this,&Widget::mySignal,this,&Widget::Print);//连接信号与槽

    emit mySignal("这是一个带有参数的信号");//发送信号
}

Widget::~Widget()
{
    delete ui;
}

void Widget::Print(QString s)
{
    qDebug()<<s;
}

        测试结果:

4、一个信号连接多个槽 

        上述的例子中是一个信号连接一个槽函数,因此当发送该信号时会调用一次槽函数。那么当一个信号连接多个槽函数时,发送该信号时具体的调用方式是什么呢?代码测试如下。

         1、widget.h的代码如下:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

signals:
    void mySignal(QString s);//自定义信号

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    void Print(QString s);//槽函数声明1
    void Print2(QString s);//槽函数声明2

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

        2、widget.cpp的代码如下:

#include "widget.h"
#include "ui_widget.h"

#include <QDebug>
#include <QPushButton>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    connect(this,&Widget::mySignal,this,&Widget::Print);//连接信号与槽
    connect(this,&Widget::mySignal,this,&Widget::Print2);//连接信号与槽

    emit mySignal("这是一个带有参数的信号");//发送信号
}

Widget::~Widget()
{
    delete ui;
}

void Widget::Print(QString s)
{
    qDebug()<<s+"槽函数1";
}

void Widget::Print2(QString s)
{
    qDebug()<<s+"槽函数2";
}

        测试结果:

        结果是当一个信号连接多个槽时,发送该信号会调用所有连接的槽的函数,侧面也反映出不仅仅是一个信号可以连接多个槽,一个槽也可以被多个信号连接,只不过这种方式的逻辑就和单个信号连接单个槽的逻辑一样,这里就不再展示代码了

5、信号与槽的断开 

        使⽤disconnect函数即可完成断开,disconnect的⽤法和connect相似,disconnect的形参和connect是一样的,即连接的逻辑和断开的逻辑是一样的。比如在上述代码中,一个信号连接了两个槽函数,使用disconnect函数断开与其中一个槽函数的连接,那么发送信号时只会执行一个槽函数,测试结果如下:

        从结果可以看到,只执行了一个槽函数。 

结语

        以上就是关于自定义信号的讲解,自定义信号虽然用的不多,但是其延申出来的知识可以帮助我们进一步理解信号与槽的细节。 

        最后如果本文有遗漏或者有误的地方欢迎大家在评论区补充,谢谢大家!!   

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

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

相关文章

【Unity精品插件】NGUI:UI设计传奇工具

&#x1f4c2; Unity 开发资源汇总 | 插件 | 模型 | 源码 &#x1f493; 欢迎访问 Unity 打怪升级大本营 在Unity3D的世界中&#xff0c;用户界面&#xff08;UI&#xff09;是玩家与游戏互动的重要桥梁。随着游戏和应用的复杂性不断增加&#xff0c;传统的UI解决方案已经难以满…

AgentRE:用智能体框架提升知识图谱构建效果,重点是开源!

发布时间&#xff1a;2024 年 09 月 13 日 Agent应用 AgentRE: An Agent-Based Framework for Navigating Complex Information Landscapes in Relation Extraction 在复杂场景中&#xff0c;关系抽取 (RE) 因关系类型多样和实体间关系模糊而挑战重重&#xff0c;影响了传统 “…

一种没有注释的语言

原文&#xff1a;Breck Yunits - 2024.09.05 JSON 是 PLDB&#xff08;A Programming Language Database&#xff09;中唯一不支持注释的流行语言。JSON 既不支持单行注释&#xff0c;也不支持多行注释。 JSON 最初是有注释的 Douglas Crockford 在 2012 年解释了他独特的设计…

稀有 Punk 10E 到手?「捡漏」的背后是一个已停止运营的 NFT 碎片化协议

撰文&#xff1a;Yangz&#xff0c;Techub News 今日凌晨&#xff0c;作为 24 个 Ape Punk 之一的 CryptoPunk #2386 以 10 ETH 的价格被 0x282 开头的地址购入。一时间&#xff0c;NFT 圈内尽是「羡慕」与「质疑」。 的确&#xff0c;即使是在如今尽显颓势的 NFT 市场&#xf…

(十三)、将一个 SpringCloud 微服务运行 以 jar 方式运行

文章目录 1、总体思路2、操作2.1、把 SpringCloud 打包为 jar生成 jar运行 jar 1、总体思路 把 SpringCloud 项目打包获得 jar &#xff0c;然后使用指定版本的jdk 运行 jar 2、操作 2.1、把 SpringCloud 打包为 jar 生成 jar 具体被打包的子 pom 文件声明为 jar 类型 <…

开源PHP免费家谱应用Webtrees简介

1. 介绍 Webtrees是一个开源的在线家谱管理系统&#xff0c;支持 GEDCOM 格式&#xff0c;允许用户协作管理家谱数据。它是免费的&#xff0c;并且功能强大。Webtrees有大量活跃用户参与的交流社区&#xff0c;在全世界约有6800个服务器。这是一个服务器应用&#xff0c;可以多…

抖音豆包大模型SFT-监督微调最佳实践

目录 一、SFT&#xff08;Supervised Finetune&#xff09;简介 二、SFT 的意义和时机 三、数据准备 3.1、数据格式 3.1.1、参考问答 3.1.2、角色扮演 3.1.3、文本分类 3.1.4、文案生成 3.2、数据量级 3.3、是否混入预置数据 3.4、如何扩充SFT数据 三、训练配置 3.…

Leetcode面试经典150题-349.两个数组的交集

题目比较简单&#xff0c;散散心吧 解法都在代码里&#xff0c;不懂就留言或者私信 class Solution {public int[] intersection(int[] nums1, int[] nums2) {/**先排个序 */Arrays.sort(nums1);Arrays.sort(nums2);int curIndex1 0;int curIndex2 0;/**先把数组的大小设置…

无线麦克风哪款好用,手机领夹麦克风哪个牌子好,麦克风推荐

随着短视频与直播行业的蓬勃发展&#xff0c;无线领夹麦克风市场迎来了前所未有的繁荣。品牌如罗德、大疆、西圣等麦克风品牌凭借卓越的技术实力与品牌影响力占据了市场的主导地位&#xff0c;其中西圣更是凭借其高性价比和用户口碑&#xff0c;稳居行业口碑品牌前列。但在这光…

百度移动刷下拉词工具:快速出下拉词的技术分析

都2024年了&#xff0c;你还在做SEO百度下拉&#xff1f;答案当然是肯定的&#xff0c;虽然百度的搜索流量不如从前&#xff0c;但移动端的流量依然是巨大的&#xff01;除了百度SEO快排以外&#xff0c;下拉也是一大流量入口&#xff0c;尤其是在移动端搜索的流量越来越大时&a…

《程序猿之设计模式实战 · 策略模式》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

GeoPandas在地理空间数据分析中的应用

GeoPandas是一个开源的Python库&#xff0c;专门用于处理和分析地理空间数据。它建立在Pandas库的基础上&#xff0c;扩展了Pandas的数据类型&#xff0c;使得用户能够在Python中方便地进行GIS操作。GeoPandas的核心数据结构是GeoDataFrame&#xff0c;它是Pandas的DataFrame的…

【PCB工艺】表面贴装技术中常见错误

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 1、什么是SMT和SMD2、表面贴装技术的优势是什么&#xff1f;3、通孔和表面贴装技术之间的区别是什么&#xff1f;4、焊…

【Qt网络】—— Qt网络编程

目录 &#xff08;一&#xff09;UDP Socket 1.1 核心API概览 1.2 代码示例 1.2.1 回显服务器 1.2.2 回显客户端 &#xff08;二&#xff09;TCP Socket 2.1 核心API概览 2.2 代码示例 2.2.1 回显服务器 2.2.2 回显客户端 &#xff08;三&#xff09;HTTP Client 3…

如何在麒麟操作系统中限制SSH远程登录而不影响FTP

如何在麒麟操作系统中限制SSH远程登录而不影响FTP 1、禁止SSH远程登录1.1 禁止Root用户1.2 禁止特定用户1.3 禁止特定用户组 2、重启SSHD服务3、注意事项 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在服务器管理中&#xff0c;出于安全…

灵办AI工具(科研学术,代码编程,学习辅导,图书报告)功能介绍

灵办AI最新添加的大模型 小灵助手&#xff1a; 功能&#xff1a;综合各种基础对话场景&#xff0c;提供高效精准的解答。 作用&#xff1a;能够快速响应用户的问题&#xff0c;帮助用户解决日常生活中的疑问&#xff0c;提升用户体验。 科研学术深度解读&#xff1a; 功能&a…

超低能耗 万物互联——光耦助力超低功率WiFi智能连接

随着物联网技术的快速发展&#xff0c;超低功率WiFi设备正逐渐成为智能化生活和工作的重要组成部分。超低功率WiFi是一种针对电池供电设备设计的无线网络技术&#xff0c;旨在降低设备功耗、延长电池寿命&#xff0c;并在需要长时间运行而不需要频繁充电或更换电池的应用中发挥…

el-popover自定义类名添加样式和手动关闭

el-popover自定义类名添加样式和手动关闭 <el-popover popper-class"popver_account" style"padding-right: 0px !important;" ref"popover" placement"bottom" width"260" trigger"click"><div class&…

Java集成开发环境(IDE)之 => “IntelliJ IDEA“ 安装

一、软件介绍 IntelliJ IDEA 是一款由 JetBrains 公司开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它主要用于 Java 语言的开发&#xff0c;但同时也支持多种其他编程语言&#xff0c;如 Kotlin、Groovy、Scala、Python、Ruby、PHP、JavaScript、TypeScript 等…

【PCB测试】最常见的PCB测试方法

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 一、PCB测试的好处1.发现错误2.降低成本3.节省时间4.减少退货率5.提高安全性 二、PCB测试内容1.孔壁质量2.电镀铜3.清…