首页 > 其他分享 >04--Qt信号与信号槽

04--Qt信号与信号槽

时间:2023-03-21 15:44:46浏览次数:38  
标签:Widget Qt -- void 信号 Student public 函数

直接上图

  • 优点:松散耦合,信号发出端和接收端可以毫无关联,如果要关联,就用connect函数

connect函数使用

常用的一般模式
connect(sender,signal,receiver,slot);
参数:
1、信号发出者
2、信号
3、信号接受者
4、接收到信号执行的任务
  • 1679368073109 大部分的类都有槽函数和信号
  • 信号:clicked(bool checked = false)
  • 槽函数:close()

举例:点击窗口按钮关闭窗口

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    //创建按钮
    QPushButton *button =new QPushButton("点击关闭窗口",this);
    this->resize(600,400);
    //信号和槽函数
    connect(button,&QPushButton::clicked,this,&Widget::close);
}
Widget::~Widget()
{
}

自定义信号槽机制

举个例子步骤1:

老师饿了,学生请客

步骤2:定义老师类和学生类(创建类的时候首字母必须大写)

步骤3:在老师类中声明信号,并且在学生类中声明并实现槽函数

步骤4:创建对象

  • 首先找到techer.h,声明一个信号(不需要实现,信号返回值void,参数可以存在,仅声明不需要实现,可以重载)

    //techer.h中
    signals:
        void hungury();
    
  • student.h(槽函数,一般在public slots里面写,对于一些高版本的qt来说,也可以写到public或者全局;返回值是void,参数可以存在,需要声明并实现,可以重载)

    //student.h
    public slots:
        void treat();
    
    //student.cpp 添加
    void Student::thread(){
    }
    

步骤5:触发信号(下课)

widget.cpp(声明触发信号的成员函数)

connect(tea,&Techer::hungury,stu,&Student::treat);
void ClassOver();

widget.cpp(定义触发信号的成员函数+调用该成员函数)

ClassOver();
}
void Widget::ClassOver(){
    //发送信号
    emit tea->hungury();
}

接下来是整个流程代码:

//创建的student和techer类,使用了QObject格式创建,在techer.cpp中没有改动任何东西,techer.h中增加以下代码
#ifndef TECHER_H
#define TECHER_H
#include <QObject>
class Techer : public QObject
{
    Q_OBJECT
public:
    explicit Techer(QObject *parent = nullptr);
signals:
    void hungury();//这个代码是作为信号存在
public slots:
};
#endif // TECHER_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:
    void treat();//这作为槽函数存在
};
#endif // STUDENT_H
//接下来是student.cpp
#include "student.h"
#include<QDebug>
Student::Student(QObject *parent) : QObject(parent)
{
}
//接下来的代码来正面其槽函数正确响应
void Student::treat(){
    qDebug()<<"请吃饭";
}
//widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include "techer.h"
#include <QWidget>
#include "student.h"
class Widget : public QWidget
{
    Q_OBJECT
//这段代码定义了一个名为Widget的类,其中包含了两个公有成员变量(对象)Teahcer *tea和Student *stu,它们都是指向Teahcer和Student类对象的指针。这意味着Widget类的对象可以通过这些指针来访问Teahcer和Student类的成员函数和成员变量。
public:
    Widget(QWidget *parent = 0);
    ~Widget();
    void ClassOver();
    Techer *tea;
    Student *stu;
};
#endif // WIDGET_H

//widget.cpp
#include "widget.h"
#include <QPushButton>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    //创建按钮
    QPushButton *button =new QPushButton("点击关闭窗口",this);
    this->resize(600,400);
    //信号和槽函数    connect(button,&QPushButton::clicked,this,&Widget::close);
    this->tea = new Techer();
    this->stu = new Student(); 
//设置正确的信号和槽机制
        connect(tea,&Techer::hungury,stu,&Student::treat);
    //调用,下课触发老师饿了的信号
    ClassOver();
}
void Widget::ClassOver(){
    //发送信号,emit是一个关键字用于Qt的信号槽系统发送信号,在这段代码中,emit用于向连接到tea对象的hungury()信号的槽发送一个信号。这个信号的发送将会触发连接到该槽的槽函数(slot function)的执行。当tea对象发出hungury()信号时,与该信号相关联的槽函数将会被调用。
    emit tea->hungury();
}
Widget::~Widget()
{
}

标签:Widget,Qt,--,void,信号,Student,public,函数
From: https://www.cnblogs.com/LaChlanYang/p/17240267.html

相关文章

  • Kingst 和 DSLogic 逻辑分析仪对比
    1、实际项目中,使用DSLogic抓去MIPI信号没有影响,但换成Kingst就不行了,对画面干扰较大。2、查了数据:Kingst的输入阻抗是220KΩ/15pF;DSLogic的输入阻抗是:250KΩ/13pF,......
  • windows下mysql5.6升级至mysql5.7
    下载mysql-5.7.39-winx64.zip并解压。停止5.6版本的mysql服务。将mysql5.6中的data目录和my.ini复制到mysql5.7的目录下。修改mysql5.7目录下的my.ini文件:#设置mysq......
  • 继承基本概念
    是一种代码复用机制,通过继承,一个类(称为派生类或子类)可以继承另一个类(称为基类或父类)的属性和行为。子类继承父类的成员变量、成员函数、构造函数和析构函数等,并且可以在此......
  • GaussDB(DWS)运维:导致SQL执行不下推的改写方案
    摘要:本文就针对因USING子句的书写方式可能导致MERGEINTO语句的执行不下推的场景,对USING子句的SQL语句进行改写一遍,整个SQL语句可以下推。本文分享自华为云社区《​​GaussD......
  • JAVA代码审计 SSRF篇
    一、巩固SSRFSSRF服务端请求伪造,Web应用程序往往会提供一些能够从远处获取图片或是文件的接口,在这些接口上用户使用指定的URL便能完成远程获取图片,下载文件等操作。......
  • DolphinDB 数据迁移与再平衡
    数据迁移再平衡的目标是保证分区副本尽可能均衡分布,副本位置影响着IO性能、节点负载,对于数据访问延迟有着较大的影响。近来,越来越多的客户对于数据容量或计算性能提出了更......
  • #创作者激励#由一个编译参数引发的gn构建依赖图谱查询
    【本文正在参加2023年第一期优质创作者激励计划】(目录)起因事情的起因是这样子的,在给学生上课的时候,想演示一下kv存储(小熊派nano开发板),代码版本master,结果发现编......
  • ByteHouse:基于 ClickHouse 的实时计算能力升级
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群ByteHouse是火山引擎数智平台旗下云原生数据分析平台,为用户带来极速分析体验,能够支撑......
  • 小程序开发外包要考量什么事项?这几个事项不可忽略
     在市场竞争越发激烈的环境下,越来越多的企业为了节省时间成本,都会找人帮助自己小程序开发外包。那么小程序开发外包要考量什么事项?今天名锐讯动为大家介绍这几个事项不可......
  • 电商系统开发值得剖析的方面,让系统闻名遐迩
     站在电商企业的角度我们可以知道,开发一个电商系统给企业带来的帮助是非常大的。所以为了成功开发,我们在过程中要剖析一些方面。下面名锐迅动为大家介绍电商系统开发值得......