connect 是 Qt 框架中用于连接信号和槽的函数,它是 Qt 的核心机制之一。通过 connect,可以将一个对象的信号与另一个对象的槽(或同一个对象的槽)连接起来,这样当信号被触发时,槽函数就会被调用。这种机制实现了对象之间的松耦合通信。
基本语法
在 Qt 5 和 Qt 6 中,connect 函数的基本语法如下:
QObject::connect(sender, &SenderType::signal, receiver, &ReceiverType::slot);
sender: 发出信号的对象。
signal: 发送的信号(方法指针)。
receiver: 接收信号的对象。
slot: 槽函数(方法指针)。
示例代码
#include <QObject>
#include <QDebug>
class Sender : public QObject {
Q_OBJECT
public:
void emitSignal() {
emit mySignal(42); // 发射信号
}
signals:
void mySignal(int value); // 定义一个信号
};
class Receiver : public QObject {
Q_OBJECT
public slots:
void mySlot(int value) {
qDebug() << "Received value:" << value; // 槽函数处理信号
}
};
int main() {
Sender sender;
Receiver receiver;
// 连接信号和槽
QObject::connect(&sender, &Sender::mySignal, &receiver, &Receiver::mySlot);
// 发射信号
sender.emitSignal();
return 0;
}
在这个示例中,当 Sender 对象的 mySignal 信号被发射时,Receiver 对象的 mySlot 槽函数就会被调用,并接收到信号的参数值 42。
Qt 5 和 Qt 6 的 connect 语法
在 Qt 5 和 Qt 6 中,推荐使用新语法(函数指针语法),因为它在编译时就能检查信号和槽的正确性,并且支持 Lambda 表达式等现代 C++ 特性。
1. Lambda 表达式
你可以直接将信号连接到一个 Lambda 表达式,而不需要定义一个槽函数。
QObject::connect(&sender, &Sender::mySignal, [](int value) {
qDebug() << "Lambda received value:" << value;
});
2. 连接到同一对象的槽
你可以在同一个对象内连接信号和槽。
QObject::connect(this, &MyClass::someSignal, this, &MyClass::someSlot);
3. 带返回值的槽
如果槽函数有返回值,返回值会被忽略,因为槽函数的目的是处理信号,而不是返回结果。
旧语法(字符串形式)
在旧的 Qt 4 语法中,信号和槽的连接是通过字符串完成的。这种方法在编译时无法检查信号和槽的正确性,容易引发错误,因此不推荐使用。
connect(sender, SIGNAL(mySignal(int)), receiver, SLOT(mySlot(int)));
自动连接
Qt 还支持自动连接机制,尤其是与 QML 或 UI 设计器结合时非常有用。你可以命名槽函数为特定的格式,Qt 会自动将 UI 事件与槽连接起来。
假设按钮在 UI 设计器中被命名为 myButton,并且希望连接 clicked() 信号到槽函数,可以定义槽函数如下:
void on_myButton_clicked();
当按钮被点击时,Qt 会自动调用这个槽函数。
断开连接(disconnect)
你可以使用 disconnect 函数断开信号和槽的连接。
QObject::disconnect(sender, &SenderType::signal, receiver, &ReceiverType::slot);
多播信号
一个信号可以连接到多个槽,发射信号时,所有连接的槽都会被调用。
QObject::connect(&sender, &Sender::mySignal, &receiver1, &Receiver::mySlot);
QObject::connect(&sender, &Sender::mySignal, &receiver2, &Receiver::myOtherSlot);
连接信号到信号
你还可以将一个信号连接到另一个信号,这样当一个信号发射时,另一个信号也会被自动发射。
QObject::connect(&sender, &Sender::mySignal, &receiver, &Receiver::anotherSignal);
总结
connect 是 Qt 的信号槽机制的核心,允许对象之间以松耦合的方式进行通信。它支持现代 C++ 特性,如 Lambda 表达式,确保了代码的灵活性和可维护性。在实际开发中,使用 Qt 5/Qt 6 的新语法进行信号槽连接更为安全和高效。