五、信号和槽#

1. 信号和槽#

信号和槽机制是 QT 的核心机制,它是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性

  • 信号:当特定的事件发生的时候,信号就由该对象发射 (emit) 出去
  • 槽:普通的成员函数,用于接受信号
  • 信号和槽绑定:信号和槽通过connet方法绑定

信号和槽连接格式:

1
2
3
4
5
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

注意:

  1. 自定义信号必须引入宏定义Q_OBJECT

  2. 自定义信号必须要定义在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);
}

注意:

  1. 系统的信号会由Qt自动发射,自定义的信号必须要在特定的情况通过emit自己发射

  2. 信号和槽函数的参数必须要一一对应