04--Qt信号与信号槽

直接上图

  • 优点:松散耦合,信号发出端和接收端可以毫无关联,如果要关联,就用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()
{
}
posted @ 2023-03-21 15:39  Lachlan_Yang  阅读(23)  评论(0编辑  收藏  举报