信号与槽(Signal and Slots)是Qt框架中最重要和最强大的特性之一,它提供了一种用于对象间通信的机制,允许在对象之间建立灵活而又松散的连接。
定义
信号的定义:
在头文件中定义
使用 signals 关键字指出信号定义区
信号像函数那样定义,可带参数
只需要声明,不需要实现
槽的定义:
在头文件中定义
使用 slots 关键字指出槽定义区
槽像函数那样定义
需要像普通函数一样实现
槽就是回调函数。
连接信号与槽
手动连接:
// sender:发送者对象
// signal:发送者的信号
// receiver:接受者对象
// method:接受者槽函数
// type:信号连接方式
QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)QObject:: 可省略
(1)使用 SIGNAL/SLOT 宏
(2)函数指针
// 定义一个发送信号的类
class Sender : public QObject
{
Q_OBJECT
public:
explicit Sender(QObject *parent = nullptr) : QObject(parent) {}
signals:
void mySignal(int value); // 定义一个名为mySignal的信号,带有一个int类型参数
public slots:
void mySlot(int value) // 定义一个名为mySlot的槽函数,与mySignal的参数列表匹配
{
qDebug() << "mySlot called with value: " << value;
}
};
// 在应用程序中创建Sender对象,并将其信号与槽连接
Sender *sender = new Sender();
QObject::connect(sender, &Sender::mySignal, sender, &Sender::mySlot);
sender->mySignal(42); // 发送mySignal信号,将42作为参数传递(3)lambda 表达式
自动连接:
通过命名连接,槽函数命名格式:
on_发送信号的对象名_信号(信号的参数)在设计界面中“转到槽”就是这种。

连接类型
连接规则
一个信号可连接多个槽
多个信号可连接在同一个槽上
一个信号可以连接另一个信号,当发射一个信号时,也会发射另一个信号,以实现某些特殊的功能。
信号的参数可以比槽函数多,反之不可以
发送信号
emit mySignal();