Qt 的信号槽机制是 Qt 框架的核心特性之一,它是一种用于对象间通信的机制。信号槽机制取代了传统的回调函数,提供了更灵活、更安全的方式来处理事件和对象之间的交互。
一、 信号槽机制的基本概念
语法:connect(sender, signal, receiver, slot);
- sender:信号发送者
- signal:信号
- receiver:信号接收者
- slot:接收对象在接收到信号之后所需要调用的函数(槽函数)
1. 信号(Signal)
- 信号是 Qt 中对象发出的一种通知,用于表示某种事件的发生。
- 信号是一个函数声明,但没有实现(类似于接口)。
- 例如,按钮被点击时,
QPushButton
会发出clicked()
信号,也可以手动触发。
2. 槽(Slot)
- 槽是一个普通的成员函数,用于响应信号。
- 槽可以有参数,也可以没有参数。
- 槽可以被直接调用,也可以通过信号触发。
3. 连接(Connect)
-
使用
QObject::connect()
函数将信号与槽连接起来。 -
当信号发出时,连接的槽函数会被自动调用。
-
语法:
QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
或者使用 Qt5 的新语法:
QObject::connect(sender, &SenderClass::signal, receiver, &ReceiverClass::slot);
一句话概括就是:谁的什么东西作用在谁的哪里,比如:你用手打他的脸就是 QObject::connect(你,手,他,脸);
二、 声明与使用
示例代码:
#include <QApplication>
#include <QPushButton>
#include <QObject>
#include <QDebug>
class Example : public QObject {
Q_OBJECT
public slots:
void handleClick() {
qDebug() << "Button clicked!";
}
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QPushButton button("Click Me");
Example example;
QObject::connect(&button, &QPushButton::clicked, &example, &Example::handleClick);
button.show();
return app.exec();
}
上面代码示例作用是点击按钮会触发Example
类中的handleClick
方法,执行并打印 “Button clicked!”
Qt中的信号槽分为系统控件自带的和我们自定义的,一般都是使用系统控件自带的,如果我们想要看一个控件他自带的信号槽有哪些,该怎么办呢,可以通过以下几种方法查找:
1. 系统自带的信号槽
1.1 在代码中选中控件类名(如 QPushButton
),按 F1
键即可打开帮助文档。
1.2 或者选中类直接点击去,找到Q_SLOTS
和 Q_SIGNALS
两部分
1.3 使用 Qt Designer,将控件拖入设计器。右键控件,选择 “转到槽…” 来查看常见槽。
2. 自定义信号槽
2.1 自定义信号
自定义信号需要使用 signals
关键字声明。注意:信号只需声明,不需要实现。
头文件声明
class CustomWidget : public QWidget {
Q_OBJECT
public:
explicit CustomWidget(QWidget *parent = nullptr);
signals:
void customSignal(int value);
};
2.2 自定义槽
槽函数是普通成员函数,需要用 slots
关键字声明。
头文件