直接上图
- 优点:松散耦合,信号发出端和接收端可以毫无关联,如果要关联,就用connect函数
connect函数使用
常用的一般模式
connect(sender,signal,receiver,slot);
参数:
1、信号发出者
2、信号
3、信号接受者
4、接收到信号执行的任务
- 大部分的类都有槽函数和信号
- 信号: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