触发自定义的信号和槽:emit
connect()函数最常用的一般形式:
connect(sender, signal, receiver, slot);
参数解释:
sender:发出信号的对象
signal:发送对象发出的信号
receiver:接收信号的对象
slot:接收对象在接收到信号之后所需要调用的函数(槽函数)
connect(信号发送者,发送的信号,信号接受者,处理槽函数 )
点击signals索引到系统自带的信号有如下几个:
void clicked(bool checked = false)
void pressed()
void released()
void togled(bool checked)
//自定义按钮
MyButton * myBtn = new MyButton;
myBtn->setText("我的按钮");
myBtn->setParent(this);//加到this以后就可以自动析构MyButton对象
//参数1:信号发送者 参数2:发送的信号 参数3:信号的接收者 参数4:处理的槽函数
connect(myBtn, &MyButton::clicked, this, &MyButton::close );
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "teacher.h"
#include "student.h"
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
Teacher * teacher;
Student * student;
void classOver();
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
teacher = new Teacher(this);//this表示将Teacher放在Widget的childern()表中,不用管对象释放
student = new Student(this);
//连接2个对象之间的关系
connect(teacher, &Teacher::hungry, student, &Student::treat);
classOver();
}
void Widget::classOver()
{
//出发老师类中的信号
//老师的hungry的信号属于自定义的信号,触发自定义信号的关键字 emit
emit teacher->hungry();
}
Widget::~Widget()
{
}
student.h
#ifndef STUDENT_H
#define STUDENT_H
#include <QObject>
class Student : public QObject
{
Q_OBJECT
public:
explicit Student(QObject *parent = 0);
~Student();
signals:
public slots:
//自定义槽函数
//高版本可以写到上面的public下面,或者全局,最好写在这里防止漏掉了
//槽函数返回值void
//槽函数需要声明也需要实现
//槽函数也可以有参数 可以发生重载
void treat();
};
#endif // STUDENT_H
student.cpp
#include "student.h"
#include <QDebug>
Student::Student(QObject *parent) : QObject(parent)
{
}
void Student::treat()
{
qDebug() <<"Student::treat()=====" ;
}
Student::~Student()
{
}
teacher.h
#ifndef TEACHER_H
#define TEACHER_H
#include <QObject>
class Teacher : public QObject
{
Q_OBJECT
public:
explicit Teacher(QObject *parent = 0);
~Teacher();
signals:
//自定义的信号,需要写道signals下面,返回类型必须是void
//没有返回值,不需要实现,只需要声明
//可以有参数,可以重载
void hungry();
public slots:
};
#endif // TEACHER_H
teacher.cpp
#include "teacher.h"
Teacher::Teacher(QObject *parent) : QObject(parent)
{
}
Teacher::~Teacher()
{
}
输出
Student::treat()=====