??代码资源:https://download.csdn.net/download/qq_36926037/85019623
5.1 系统信号&系统槽函数
5.1.1 系统信号&系统槽函数的定义
??以按钮(QPushButton)类为例,系统已经为该类定义了信号和槽函数 在这里插入图片描述
5.1.2 系统信号&系统槽函数的连接
??前提条件:创建了窗口,窗口内包含按钮 ??需求:通过按钮关闭窗口 ??实现: ????connet(信号发送者,信号(地址),信号接受者,槽函数(地址)) ????信号格式: &信号发送者所属类::信号 ??其中信号为系统为信号所属类创建的系统信号 ????槽函数格式: &信号接受者所属类别::信号接受者处理信号的槽函数??其中槽函数为系统为信号接收者所属类创建的系统信号
#include "mywidget.h"
#include "QPushButton"
#include <mypushbutton.h>
#include <QDebug>
myWidget::myWidget(QWidget *parent)
: QWidget(parent)
{
QPushButton *btn=new QPushButton;
btn->setParent(this);
btn->setText("第一个按钮");
QPushButton *btn2=new QPushButton("第二个按钮",this);
btn2->move(100,100);
resize(600,400);
setWindowTitle("第一个窗口");
setFixedSize(600,400);
btn->resize(100,50);
MyPushButton *btn3=new MyPushButton;
btn3->setText("自定义按钮");
btn3->move(100,200);
btn3->setParent(this);
connect(btn3,&MyPushButton::clicked,this,&myWidget::close);
connect(btn2,&QPushButton::clicked,this,&QWidget::close);
}
myWidget::~myWidget()
{
qDebug()<<"窗口对象的析构"<<endl;
}
5.2 自定义信号&自定义槽函数
5.2.1 自定义信号&自定义槽函数的创建
??实现: ????connet(信号发送者,信号(地址),信号接受者,槽函数(地址)) ????信号格式: &信号发送者所属类::信号 ??其中信号为自定义的信号 ????槽函数格式: &信号接受者所属类别::信号接受者处理信号的槽函数??其中槽函数为自定义信号 ??(1)创建一个新项目,并且新项目包含一个空窗口,效果如下图所示: ??(2)创建Teacher类和student类 ??(3) 自定义信号:写在头文件中类的signals里面;信号返回值为void类型;信号只需要声明不需要实现;可以有参数,可以重载
#ifndef TEACHER_H
#define TEACHER_H
#include <QObject>
class Teacher : public QObject
{
Q_OBJECT
public:
explicit Teacher(QObject *parent = nullptr);
signals:
void hungry();
};
#endif
#include "teacher.h"
#include <QDebug>
Teacher::Teacher(QObject *parent) : QObject(parent)
{
}
??(4)自定义槽函数:写在头文件的类的public slots里面或者写在public 或者全局下;返回值为void类型;需要声明也需要实现;可以有参数,可以重载
#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
#include "student.h"
#include <QDebug>
Student::Student(QObject *parent) : QObject(parent)
{
}
void Student::treat()
{
qDebug()<<"请老师吃饭"<<endl;
}
5.2.2 自定义信号&自定义槽函数的连接
??(5)在窗口中, 使用槽函数和信号:首先创建信号发送者和信号接受者;然后通过connect建立连接;最后使用emit关键字触发信号,信号将通过连接传给信号接受者启动槽函数(头文件和源文件的相关代码)
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "teacher.h"
#include "student.h"
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
Teacher * zt;
Student * st;
void classIsOver();
};
#endif
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->zt=new Teacher(this);
this->st=new Student(this);
connect(zt,&Teacher::hungry,st,&Student::treat);
classIsOver();
}
void Widget ::classIsOver()
{
emit zt->hungry();
}
Widget::~Widget()
{
delete ui;
}
5.3 重载的自定义信号&自定义槽函数
5.3.1 创建重载的自定义信号&自定义槽函数
??项目背景:基于5.2节项目 ??(1)创建重载信号
#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);
};
#endif
#include "teacher.h"
#include <QDebug>
Teacher::Teacher(QObject *parent) : QObject(parent)
{
}
??(2)创建重载槽函数
#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();
void treat(QString foodName);
};
#endif
#include "student.h"
#include <QDebug>
Student::Student(QObject *parent) : QObject(parent)
{
}
void Student::treat()
{
qDebug()<<"请老师吃饭"<<endl;
}
void Student::treat(QString foodName)
{
qDebug()<<"请老师吃法,老师要吃"+foodName<<endl;
}
??(3)使用重载的槽函数和信号
5.3.2 连接重载的自定义信号&槽函数
5.3.2.1 有参信号连接有参槽函数
??3.1 使用有参的槽函数和信号:需要明确(重载)信号和(重载)槽函数的地址:例 void (Teacher::*teacherSignal )(QString)=&Teacher::hungry---------》代表参数为QString的重载函数的地址 ??代码:connect(信号发送者,有参信号(地址),信号接受者,有参槽函数(地址))
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->zt=new Teacher(this);
this->st=new Student(this);
void (Teacher::*teacherSignal )(QString)=&Teacher::hungry;
void (Student ::*studentSlot )(QString)=&Student::treat;
connect(zt,teacherSignal,st,studentSlot);
classIsOver();
}
void Widget ::classIsOver()
{
emit zt->hungry("宫爆鸡丁");
}
Widget::~Widget()
{
delete ui;
}
5.3.2.2 无参信号连接无参槽函数
??3.2 使用无参的槽函数和信号:需要明确(重载)信号和(重载)槽函数的地址:例 void (Teacher::*teacherSignal )(void)=&Teacher::hungry---------》代表无参的函数的地址 ??代码:connect(信号发送者,无参信号(地址),信号接受者,无参槽函数(地址))
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->zt=new Teacher(this);
this->st=new Student(this);
void (Teacher::*teacherSignal )(QString)=&Teacher::hungry;
void (Student ::*studentSlot )(QString)=&Student::treat;
connect(zt,teacherSignal,st,studentSlot);
void (Teacher::*teacherSignal1 )(void)=&Teacher::hungry;
void (Student ::*studentSlot1 )(void)=&Student::treat;
connect(zt,teacherSignal1,st,studentSlot1);
classIsOver();
}
void Widget ::classIsOver()
{
emit zt->hungry();
}
Widget::~Widget()
{
delete ui;
}
5.4 信号&信号连接
5.4.1 信号连接信号
??代码:connect(信号发送者,信号(地址),信号接受者,信号(地址)) ??流程:一个按钮点击信号——>触发第一个连接的信号——>该信号触发另一个连接的槽函数
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->zt=new Teacher(this);
this->st=new Student(this);
void (Teacher::*teacherSignal )(QString)=&Teacher::hungry;
void (Student ::*studentSlot )(QString)=&Student::treat;
connect(zt,teacherSignal,st,studentSlot);
void (Teacher::*teacherSignal1 )(void)=&Teacher::hungry;
void (Student ::*studentSlot1 )(void)=&Student::treat;
connect(zt,teacherSignal1,st,studentSlot1);
QPushButton *btn1=new QPushButton;
btn1->setParent(this);
btn1->setText("下课");
connect(btn1,&QPushButton::clicked,zt,teacherSignal1);
}
void Widget ::classIsOver()
{
emit zt->hungry();
}
Widget::~Widget()
{
delete ui;
}
5.4.2 信号断开信号
??代码:disconnect(信号发送者,信号,信号接受者,信号)
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->zt=new Teacher(this);
this->st=new Student(this);
void (Teacher::*teacherSignal )(QString)=&Teacher::hungry;
void (Student ::*studentSlot )(QString)=&Student::treat;
connect(zt,teacherSignal,st,studentSlot);
void (Teacher::*teacherSignal1 )(void)=&Teacher::hungry;
void (Student ::*studentSlot1 )(void)=&Student::treat;
connect(zt,teacherSignal1,st,studentSlot1);
QPushButton *btn1=new QPushButton;
btn1->setParent(this);
btn1->setText("下课");
connect(btn1,&QPushButton::clicked,zt,teacherSignal1);
disconnect(btn1,&QPushButton::clicked,zt,teacherSignal1);
}
void Widget ::classIsOver()
{
emit zt->hungry();
}
Widget::~Widget()
{
delete ui;
}
5.5 信号和槽总结
??(1)一个信号可以连接多个槽函数 ??(2)多个信号可以连接一个槽函数 ??(3)信号和槽函数的参数必须类型一一对应 ??(4)信号和槽函数的参数个数不需要一致,信号参数个数可以多余槽函数参数个数,并且槽函数的参数与信号的参数类型一致,反之不可以
|