没志青年
发布于 2025-07-29 / 22 阅读
0

QT 信号与槽

信号与槽(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();