有时候代码可能复杂,我们需要一个信号连接另一个信号,比如例子中的下课不是直接运行时触发的,而是点击下课按钮
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QPushbutton.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//创建一个老师对象
this->tc = new Teacher(this);
//创建一个学生对象
this->st = new Student(this);
void(Teacher::*teachersignal2)(void) = &Teacher::Hungry;
void(Student::*studentslot2)(void) = &Student::Treat;
connect(tc,teachersignal, st, studentslot);
QPushButton *btn = new QPushButton("下课",this);
this->resize(600,400);
connect(tc,teachersignal2, st, studentslot2);
connect(btn,&QPushButton::clicked,tc,teachersignal2);
}
MainWindow::~MainWindow()
{
delete ui;
}
扩展内容
断开信号 使用disconnect(tc,teachersignal2, st, studentslot2);
一个信号可以连接多个槽函数
多个信号可以连接一个槽函数
在teacher类加入一个crying信号
#ifndef TEACHER_H
#define TEACHER_H
#include <QObject>
class Teacher : public QObject
{
Q_OBJECT
public:
explicit Teacher(QObject *parent = nullptr);
signals:
void Hungry();
void Hungry(QString foodName);
void Crying(); //老师感动哭了
};
#endif // TEACHER_H
#
void(Teacher::*teachersignal)(QString) = &Teacher::Hungry;
void(Student::*studentslot)(QString) = &Student::Treat;
void(Teacher::*teachersignal2)(void) = &Teacher::Hungry;
void(Student::*studentslot2)(void) = &Student::Treat;
void(Teacher::*teachersignal3)(void) = &Teacher::Crying;
connect(tc,teachersignal, st, studentslot);
//classIsOver();
QPushButton *btn = new QPushButton("下课",this);
this->resize(600,400);
//connect(btn,&QPushButton::clicked,this,&MainWindow::classIsOver);
connect(tc,teachersignal2, st, studentslot2);
connect(tc,teachersignal3, st, studentslot2);
connect(btn,&QPushButton::clicked,tc,teachersignal2);
connect(btn,&QPushButton::clicked,tc,teachersignal3);
代码中我使用qpushbutton触发了两个信号,同理我也可以使用不同信号触发同一个槽函数
信号和槽函数的参数必须一一对应
信号参数个数可以多余槽的参数个数,但类型要一一对应
Qt4版本以前的信号与槽的连接
连接无参
connect(tc,SIGNAL(Hungry()),st,SLOT(Treat()));
优点,参数直观。缺点,类型不做检测(编译不做检测,运行报错)
Qt5以上支持Qt4的写法,反之不支持。