1.信号与槽
1.1使用按钮关闭窗口
前面学习了创建按钮,那么如何让按钮实现功能呢,需要用到信号与槽的知识
实现过程:按钮->点击->窗口->关闭
连接过程使用的函数connect
伪代码connect(信号的发送者,发送的信号,信号的接受者,信号的处理(槽))
信号槽的优点,松散耦合:前两个过程为信号发端,后两者为接收端,本身没有关联,通过connect函数耦合在一起
//参数1 信号的发送者 参数2 发送的信号(函数的地址)
//参数3 信号的接收者(窗口指针) 参数4 信号的处理(槽)
connect(btn,&QPushButton::clicked,this,&myWidget::close);
//参数可以用父类,效果一样
//connect(btn,&QPushButton::clicked,this,&QWidget::close);
效果即为点击按钮窗口关闭
2.1自定义信号与槽
创建两个新的类,老师类与学生类
考试时间到,老师发出信号,开始考试,学生处理信号,开始答题
teacher.h头文件声明发出信号
signals://自定义信号写在signals下
//返回值为void只声明不实现
//可以有参数可以重载
void start();
student.h头文件声明接收信号
class Student : public QWidget
{
Q_OBJECT
public:
explicit Student(QWidget *parent = nullptr);
void starttest();//学生处理信号不可以写在信号下,需要写在public或者全局
//返回值void需声明也需实现(在.cpp中)
//可以有参可以重载
signals:
};
student.cpp实现
#include "student.h"
#include<QDebug>//打印声明
Student::Student(QWidget *parent) : QWidget(parent)
{
}
void Student::starttest(){
qDebug()<<"开始考试";
}
接下来在窗口中创建老师和学生的对象实现操作,先在窗口头文件中引用老师和同学类的头文件,并在私有成员中声明指针
#include"student.h"
#include"teacher.h"
Teacher*tc;
Student*st;
widget.cpp构造函数中先对私有成员指针初始化
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//创建对象
this->tc=new Teacher(this);
this->st=new Student(this);
//连接函数
connect(tc,&Teacher::start,st,&Student::starttest);
}
运行之后发现并没有出现开始考试的结果,这是因为,老师不是什么时候都发出信号,前提是考试时间到,就比如点击按钮发出信号,没人点击就不会发出
解决:在窗口私有成员里面声明一个考试时间到的函数,再调用它
widget.cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//创建对象
this->tc=new Teacher(this);
this->st=new Student(this);
//连接函数
connect(tc,&Teacher::start,st,&Student::starttest);
//调用下课函数
timeisstart();
}
void Widget::timeisstart(){
//emit为触发关键字
emit tc->start();
}
运行之后就显示处理的信号了