五、信号和槽
1. 信号和槽
信号和槽机制是 QT 的核心机制,它是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性
- 信号:当特定的事件发生的时候,信号就由该对象发射 (emit) 出去
- 槽:普通的成员函数,用于接受信号
- 信号和槽绑定:信号和槽通过connet方法绑定
信号和槽连接格式:
| bool QMetaObject::Connection connect(const Object *sender, //发送信号的对象
Func1 signal, //信号
constObject *receiver,//接收者
Func2 slot, //槽函数
Qt::ConnectionType type = Qt::AutoConnection)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 | #include "MainWindow.h"
#include <QApplication>
MainWindow::MainWindow(QWidget *parent) : QWidget(parent) {
setFixedSize(400, 400);
QPushButton *btn = new QPushButton("退出程序", this);
//信号和槽绑定
/**
* 参数1:发送信号的对象
* 参数2:发送的信号
* 参数3:接收信号的对象(槽函定义的对象)
* 参数4:槽函数
*/
connect(btn, &QPushButton::clicked, this, &MainWindow::btnClick);
}
MainWindow::~MainWindow() = default;
//接收按钮点击的槽函数
void MainWindow::btnClick() {
QApplication::quit();
}
|
通过connet
方法连接信号和槽函数
槽函数btnClick
绑定按钮btn
的信号clicked
,点击按钮就会自动执行槽函数btnClick
2. 自定义信号
除了系统已经定义好的信号之外,也可以自定义信号
1、定义信号类SignalWidget.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | #ifndef QT_SIGNALWIDGET_H
#define QT_SIGNALWIDGET_H
#include <QObject>
class SignalWidget : public QObject {
//1.如果需要自定义信号,需要加上宏定义
Q_OBJECT
public:
SignalWidget(QObject *parent = Q_NULLPTR);
~SignalWidget();
signals:
//2.定义在signals下是信号,函数不需要实现
void mySignal(int age);
};
#endif //QT_SIGNALWIDGET_H
|
注意:
-
自定义信号必须引入宏定义Q_OBJECT
-
自定义信号必须要定义在signals下
2、定义槽函数类SLotWidget.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | #include "SlotWidget.h"
SlotWidget::SlotWidget(QObject *parent) : QObject(parent) {
}
SlotWidget::~SlotWidget() {
}
//接收自定义信号的槽函数
void SlotWidget::mySlot(int age) {
qDebug() << "接收到自定义信号了:" << endl;
}
|
mySlot槽函数用来接收信号
3、在程序中MainWindow.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 | #include "MainWindow.h"
MainWindow::MainWindow(QWidget* parent):QWidget(parent) {
//创建发送信号对象和槽函数对象
signalWidget = new SignalWidget(this);
slotWidget = new SlotWidget(this);
//设置大小
setFixedSize(400,400);
QPushButton *btn = new QPushButton("发送信号",this);
//绑定自定义的信号和槽函数
connect(signalWidget,&SignalWidget::mySignal,slotWidget,&SlotWidget::mySlot);
//绑定了按钮的信号
connect(btn,&QPushButton::clicked,this,&MainWindow::btnClick);
}
MainWindow::~MainWindow() {
}
//按钮点击事件槽函数
void MainWindow::btnClick(){
//发送信号
emit signalWidget->mySignal(30);
}
|
注意:
-
系统的信号会由Qt自动发射,自定义的信号必须要在特定的情况通过emit
自己发射
-
信号和槽函数的参数必须要一一对应