qt信号槽

news2024/11/19 21:16:48

目录

        

自定义信号槽


所谓信号槽,实际就是观察者模式 (发布 - 订阅模式)。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发

在 Qt 中我们需要使用 QOjbect类中的 connect去连接信号和信号槽函数

QMetaObject::Connection QObject::connect(
    	const QObject *sender, PointerToMemberFunction signal, 
        const QObject *receiver, PointerToMemberFunction method, 
		Qt::ConnectionType type = Qt::AutoConnection);
参数:
  - sender:   发出信号的对象
  - signal:   属于sender对象, 信号是一个函数, 这个参数的类型是函数
              指针, 信号函数地址
  - receiver: 信号接收者
  - method:   属于receiver对象, 当检测到sender发出了signal信号, 
              receiver对象调用method方法,信号发出之后的处理动作
 
//  参数 signal 和 method 都是函数地址, 因此简化之后的 connect() 如下:
connect(const QObject *sender, &QObject::signal, 
        const QObject *receiver, &QObject::method);

使用connect()进行信号槽连接的注意事项:

connect函数相对于做了信号处理动作的注册 调用conenct函数的sender对象的信号并没有产生, 因此receiver对象的 method 也不会被调用 method槽函数本质是一个回调函数, 调用的时机是信号产生之后, 调用是Qt框架来执行的 connect中的sender和recever两个指针必须被实例化了, 否则conenct不会成功

按钮就是信号的发送者,窗口接收发来的信号去处理

标准槽函数

示例:

 处理过程:程序运行,点击按钮,关闭窗口

在mainwindow窗口里面做如下操作,对应ui界面的closebt这个按钮,clicked点击发信号,发给this当前窗口对象,当前窗口接收到,做出close这个操作

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->closebt,&QPushButton::clicked,this,&MainWindow::close);
}

当然了标准的槽函数,就是那个处理函数肯定不能满足我们日常需求,所以我们需要自定义槽函数(回调)

自定义信号槽

如果想要在QT类中自定义信号槽, 需要满足一些条件, 并且有些事项也需要注意:

  1. 要编写新的类并且让其继承Qt的某些标准类

  2. 这个新的子类必须从QObject类或者是QObject子类进行派生

  3. 在定义类的头文件中加入 Q_OBJECT 宏

// 在头文件派生类的时候,首先像下面那样引入Q_OBJECT宏:
class MyMainWindow : public QWidget
{
    Q_OBJECT
    ......
}

demo:

构建一个son和father类

father.h 

#ifndef FATHER_H
#define FATHER_H

#include <QObject>

class father : public QObject
{
    Q_OBJECT
public:
    explicit father(QObject *parent = nullptr);

public:
    //槽函数
    void eatrice();

};

#endif // FATHER_H

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include"son.h"
#include"father.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void eating();//槽函数
private:
    Son *s;
    father* f;
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

son.h

#ifndef SON_H
#define SON_H

#include <QObject>

class Son : public QObject
{
    Q_OBJECT
public:
    explicit Son(QObject *parent = nullptr);

signals:
    //信号函数
    void eat();
};

#endif // SON_H

加了signal关键字,就不用再去定义了,只需要声明

father.cpp

做出信号槽函数定义

#include "father.h"
#include<QDebug>
father::father(QObject *parent) : QObject(parent)
{

}

void father::eatrice()
{
    qDebug()<<"来吃大米饭.";
}

son.cpp什么也不做,因为signal带定义,不需要我们自己去cpp文件重写具体实现

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    s=new Son;
    f=new father;
    connect(s,&Son::eat,f,&father::eatrice);
    connect(ui->eating,&QPushButton::clicked,this,&MainWindow::eating);

    connect(ui->closebt,&QPushButton::clicked,this,&MainWindow::close);
}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::eating()
{
    //发射自定义信号
    s->eat();
}

运行程序:

每点击一次eat按钮,回调就做一次反应

一个信号可以对接多个槽函数

一个槽函数也能接收多个信号

在mainwindow里面实现一个sleep函数,加个connect,也去相应eat按钮

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    s=new Son;
    f=new father;
    connect(s,&Son::eat,f,&father::eatrice);
    connect(s,&Son::eat,this,&MainWindow::sleep);
    connect(ui->eating,&QPushButton::clicked,this,&MainWindow::eating);

    connect(ui->closebt,&QPushButton::clicked,this,&MainWindow::close);
}


void MainWindow::sleep()
{
    qDebug()<<"快去睡觉.";
}

点击窗口,新的槽函数也去相应处理

 信号也能连接信号,相当于传递了数据

对上面做如下改动:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    s=new Son;
    f=new father;
    connect(s,&Son::eat,f,&father::eatrice);
    connect(s,&Son::eat,this,&MainWindow::sleep);
    
        //这样直接用信号,相当于下面我们自己实现的发信号的函数就可以不用了
    connect(ui->eating,&QPushButton::clicked,s,&Son::eat);
    
    //connect(ui->eating,&QPushButton::clicked,this,&MainWindow::eating);

    connect(ui->closebt,&QPushButton::clicked,this,&MainWindow::close);
}

MainWindow::~MainWindow()
{
    delete ui;
}
/*
void MainWindow::eating()
{
    //发射自定义信号
    s->eat();
}*/
void MainWindow::sleep()
{
    qDebug()<<"快去睡觉.";
}

程序运行结果和上面一样

信号槽是可以断开的

disconnect(const QObject *sender, &QObject::signal, 
        const QObject *receiver, &QObject::method);

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

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

相关文章

springboot实验室管理系统-计算机毕设 附源码86757

springboot实验室管理系统 摘 要 验室管理系统是将实验室的分析仪器通过计算机网络连起来&#xff0c;采用科学的管理思想和先进的数据库技术&#xff0c;实现以实验室为核心的整体环境的全方位管理。它集用户管理&#xff0c;实验室信息管理&#xff0c;实验室预约管理&#x…

【历史上的今天】6 月 21 日:第一台存储程序计算机首次运行;XML 之父诞生;IBM 推出 AS/400

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 6 月 21 日&#xff0c;在 23 年前的今天&#xff0c;中国联通公司在香港、纽约成功上市&#xff0c;筹资 56.5 亿美元&#xff0c;进入全球首次股票公开发行史…

LeetCode - #86 分隔链表

文章目录 前言1. 描述2. 示例3. 答案关于我们 前言 我们社区陆续会将顾毅&#xff08;Netflix 增长黑客&#xff0c;《iOS 面试之道》作者&#xff0c;ACE 职业健身教练。&#xff09;的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 LeetCode 算法到目前我们已经更新…

Cortext-M3系列:M3的底层编程(7)

1、概览 在CM3上编程&#xff0c;既可以使用C也可以使用汇编&#xff0c;keil也支持C&#xff0c;但是大多数人还是会在C与汇编。C与汇编都“尺有所短&#xff0c;寸有所长”&#xff0c;不能互相取代。使用C能开发大型程序&#xff0c;而汇编则用于执行特种任务。 1.1 使用汇…

去中心化金融(DeFi)的发展历史

随着Web3.0的兴起&#xff0c;去中心化金融&#xff08;Decentralized Finance&#xff0c;DeFi&#xff09;正逐渐成为金融领域的热门话题。DeFi旨在通过区块链技术和智能合约&#xff0c;实现无需信任的金融交易和服务&#xff0c;摆脱传统金融中心化的限制。然而&#xff0c…

C# Winform Label 控件

目录 一、概述 二、基本用法 1.控件内容显示 2.控件的外观 3.自定义控件的大小 4.控件的内边距 5.设置文本的固定位置 6.控件的事件 结束 一、概述 Label 控件是 winform 开发中最常用的一个控件&#xff0c;一般用做显示文本&#xff0c;也有时用做打开链接等操作。…

如何解决无法直接启动带有“类库输出类型”的项目

输出类型为类库的项目是编译为 dll 文件的项目&#xff0c;该文件旨在供其他项目使用。它无法直接启动&#xff0c;因为它没有 exe 文件。若要调试此项目&#xff0c;请在此解决方案中添加一个引用库项目的可执行项目。将这个可执行项目设置为启动项目&#xff0c;如下&#xf…

msp430fr2155 在线升级(一)

前言&#xff1a;由于单片机如果不支持USB等方式在线升级&#xff0c;每次升级会设计拆机升级单片机&#xff0c;这对于一个成熟的产品是很鸡肋的。所以记录一下本次研发升级功能的过程以及所需要的问题。 一、升级程序设计 二、内存重新分配 1.芯片原有内存分配 原有内存分…

做电商服务软件(电商ERP),怎么实现与电商平台的数据交互?

电商领域是目前互联网最热门、最活跃的行业之一&#xff0c;随着消费需求的增长和普及化&#xff0c;用户对于商品种类和购物体验的要求也越来越高&#xff0c;精准、高效、快速成为谋求更大商品销量的共同目标。因此&#xff0c;电商服务软件的市场需求正不断增强。 想要开发一…

C++---虚函数(8)

多态 虚函数 虚函数就是在类的成员函数声明前加virtual&#xff0c;该成员函数就变成了虚函数。一旦一个类中有虚函数&#xff0c;编译器就会为该类生成虚函数表。 虚函数表中一个元素记录一个虚函数的地址&#xff0c;使用该类构造对象时&#xff0c;对象前4(8)个字节记录虚…

团队知识库的使用场景有哪些?如何搭建团队知识库?

团队知识库是一种用于共享和管理团队知识和信息的工具。它可以帮助团队成员更好地组织、存储、查找和分享信息&#xff0c;提高工作效率和准确性。以下是团队知识库的使用场景和搭建方法的详细介绍。 一、团队知识库的使用场景 项目管理 团队知识库可以帮助团队成员更好地管…

封神之后,又来超神?南卡OE骨传导开放式耳机有啥新本领

终于到了适合夜跑的温度&#xff0c;我的新跑鞋和专用陪跑运动耳机也都收到了&#xff0c;万事俱备却意外中招“二阳”了。虽然身体情况&#xff0c;短期是不能支持去跑步运动了&#xff0c;但每天戴着新耳机打打王者也还是一样很欢乐的。 反正现在时间很多很闲&#xff0c;我…

pyqt6安装与配置(基于vscode环境)

一、安装pyqt6和pyqt6-tools包 注意&#xff1a;pyqt6-tools目前仅支持python3.9版本&#xff0c;3.9版本后的安装部成功。&#xff08;截止2022.11.20&#xff09; 1.1 安装pyqt6和pyqt6-tools 安装pyqt和pyqt6-tools可以使用conda和pip进行安装 &#xff08;1&#xff09…

基于高通camera-帧率-曝光

前人种树&#xff0c;后人乘凉&#xff1b;创造不易&#xff0c;请勿迁移~ daisy.skye的博客_CSDN博客-嵌入式,Qt,Linux领域博主 daisy.skye擅长嵌入式,Qt,Linux,等方面的知识 https://blog.csdn.net/qq_40715266?typelately ———————————————— 版权声明&…

计算机网络(谢希仁-第八版)第四章习题全解

4-01 网络层向上提供的服务有哪两种&#xff1f;试比较其优缺点&#xff1f; 虚电路服务和数据报服务。 虚电路 优点&#xff1a; 1.可以提供可靠的通信服务 2.因为数据是沿着建立的虚电路进行传输的&#xff0c;因此分组的首部不需要携带完整的目的主机 的地址&…

redis 的基本介绍以及 五种 数据类型

一、redis是什么&#xff1f; 一句话&#xff1a;redis 是一个开源的、使用C语言编写的、支持网络交互&#xff0c;基于内存也可持久化的 key-value &#xff08;非关系型&#xff09;数据库 redis作者博客&#xff0c;有兴趣的小伙伴可以去逛一逛&#xff1a;http://github.…

后台登录功能开发 -- 手把手教你做ssm+springboot入门后端项目黑马程序员瑞吉外卖(二)

文章目录 前言三、后台登录功能开发1. 需求分析2. 代码开发3. 功能测试&#xff08;简略&#xff09; 四、后台退出功能开发1. 需求分析2. 代码开发3. 功能测试&#xff08;简略&#xff09; 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客…

Servlet规范maven创建webapp项目

main目录下新建webapp pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.…

C++完成淄博烧烤节管理系统

背景&#xff1a; 这次我们结合今年淄博烧烤做一个餐厅管理系统&#xff0c;具体需求如下&#xff0c;我们选择的是餐饮商家信息管理 问题描述&#xff1a; 淄博烧烤今年大火&#xff0c;“进淄赶烤”是大家最想干的事情&#xff0c;淄博烧烤大火特火的原因&#xff0c;火的…

SSM海南省陵水县旅游网站-计算机毕设 附源码87145

SSM海南省陵水县旅游网站 摘 要 本系统的前端界面主要实现页面的美观和动态效果使之符合广大群众的审美观&#xff0c;后台主要使用的技术主要有Java编程语言&#xff0c;SSM框架&#xff0c;JSP技术、Ajax技术进行开发系统。海南省陵水县旅游网站解决了传统旅游方式中数据分析…