Qt基础 信号和槽、自定义的信号和槽及案例
程序员文章站
2024-01-02 12:30:28
...
根据B站《最新QT从入门到实战完整版|传智教育》学习的,BV号:BV1g4411H78N
信号和槽
链接函数:connect
参数
参数1:信号的发送者
参数2:发送的信号(函数的地址)
参数3:信号的接受者
参数4:处理的槽函数(函数的地址)、
例子(实现点击按钮关闭窗口):connect(myBtn,&QPushButton::clicked,this,&Qwidget::close)
信号槽的优点
松散耦合,信号发送端和接受端本身是没有联系的,通过connect链接将两端耦合在一起
自定义的信号和槽及案例
自定义信号
1.写到signals下
2.返回值为void类型
3.需要声明,不需要实现
4.可以有参数,可以重载
自定义槽函数
1.返回值为void类型
2.需要声明,也需要实现
3.可以有参数,可以重载
4.可写到public slot下 或 public下 或 全局
出发自定义的信号
emit 自定义的信号;
案例
下课后,老师触发“饿了”的信号,学生响应信号“请客吃饭”
student.h
#ifndef STUDENT_H
#define STUDENT_H
#include <QObject>
class Student : public QObject
{
Q_OBJECT
public:
explicit Student(QObject *parent = nullptr);
//早期Qt版本槽函数只能写在public slots下,高级版本直接写在public或全局下
//返回值为void类型,需要声明,也需要实现
//可以有参数,可以发生重载
void treat();
signals:
};
#endif // STUDENT_H
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
widget.h
#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();
private:
Ui::Widget *ui;
Teacher * t;
Student * st;
void ClassIsOver();
};
#endif // WIDGET_H
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
student.cpp
#include "student.h"
#include<QDebug>
Student::Student(QObject *parent) : QObject(parent)
{
}
void Student::treat()
{
qDebug() << "请老师吃饭";
}
teacher.cpp
#include "teacher.h"
Teacher::Teacher(QObject *parent) : QObject(parent)
{
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"
//Teacher类 老师类
//Student类 学生类
//下课后,老师会触发一个信号“饿了”,学生响应信号然后“请客吃饭”
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//创建一个老师对象
this->t = new Teacher(this);
//创建一个学生对象
this->st = new Student(this);
//老师饿了学生请客的连接
connect(t,&Teacher::hungry,st,&Student::treat);
//调用下课函数
ClassIsOver();
}
void Widget::ClassIsOver()
{
//下课函数,调用后触发老师饿了的信号
emit t->hungry();
}
Widget::~Widget()
{
delete ui;
}