Qt的信号槽机制不仅可以使用系统提供的部分,也可以自定义信号槽。信号槽是Qt的核心机制,只要是继承了QObject类的子类或者间接子类都可以使用信号槽机制,无论是不是GUI程序。
下面我们来实现一个自定义的信号槽,我们将有两个类,分别是Teacher和Student。老师讲课,学生听课。
//Teacher.h
#ifndef TEACHER_H
#define TEACHER_H
#include <QObject>
class Teacher : public QObject
{
Q_OBJECT
public:
explicit Teacher(QString str)
{
this->str = str;
}
void send()
{
emit speak(str); //发射信号
}
signals:
void speak(const QString & str); //信号
private:
QString str;
};
#endif // TEACHER_H
//Student.h
#ifndef STUDENT_H
#define STUDENT_H
#include <QObject>
#include <QDebug>
class Student : public QObject
{
Q_OBJECT
public:
//explicit Student(QObject *parent = nullptr);
void listen(const QString & str)
{
qDebug() << "老师讲的内容是:" << str;
}
signals:
};
#endif // STUDENT_H
//main.cpp
#include <QCoreApplication>
#include "teacher.h"
#include "student.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Teacher teacher("1+1=2");
Student studet;
QObject::connect(&teacher, &Teacher::speak, &studet, &Student::listen);
teacher.send();
return a.exec();
}
运行结果如下:
因此,自定义信号槽需要三个步骤:
信号可以连接到信号,这和信号槽的连接没有本质区别;
一个信号可以连接多个槽函数,但是槽函数的执行顺序是不确定的,不建议这么做;
一个槽函数可以连接多个信号;
信号槽的连接可以被取消,使用disconnect函数。