在 Qt 框架中,sender()
是一个非常重要的成员函数,它属于 QObject
类(及其所有子类,因为 QObject
是 Qt 对象模型的基础)。sender()
函数的目的是返回发送最近一个信号的对象指针。这在槽函数(slot)中尤其有用,因为当你连接一个信号到一个槽时,槽函数通常需要知道是哪个对象触发了这个信号。
使用场景
假设你有多个对象可以发送相同的信号,并且你希望槽函数能够区分是哪个对象发送了信号。这时,你就可以在槽函数内部调用 sender()
来获取发送信号的对象指针,并据此执行不同的逻辑。
示例
以下是一个简单的示例,展示了如何在槽函数中使用 sender()
:
class MyObject : public QObject {
Q_OBJECT
public slots:
void mySlot() {
QObject *senderObj = sender();
if (senderObj) {
qDebug() << "Signal sent by:" << senderObj->objectName();
} else {
qDebug() << "No sender found.";
}
}
};
// ...
MyObject obj;
QObject sender1, sender2;
sender1.setObjectName("Sender1");
sender2.setObjectName("Sender2");
connect(&sender1, SIGNAL(destroyed(QObject*)), &obj, SLOT(mySlot()));
connect(&sender2, SIGNAL(destroyed(QObject*)), &obj, SLOT(mySlot()));
// 当 sender1 或 sender2 被销毁时,mySlot() 会被调用,并打印出是哪个对象发送了信号。
在这个例子中,mySlot()
槽函数通过调用 sender()
来获取发送 destroyed
信号的对象指针,并通过 objectName()
获取该对象的名称(假设你已经设置了对象名称)。这样,你就可以在槽函数中区分是哪个对象触发了信号。
注意事项
sender()
只能在槽函数中被调用,因为只有在槽函数执行时,Qt 的信号-槽机制才会设置正确的发送者信息。- 如果你在槽函数之外调用
sender()
,它将返回nullptr
,因为没有正在执行的信号-槽连接来提供发送者信息。 - 在某些情况下,特别是当使用 Lambda 表达式作为槽时,
sender()
可能不是最直接或最清晰的方式来获取发送者信息。在这种情况下,你可以考虑使用其他机制来传递所需的信息。