QObject是 Qt 所有对象的基类,当某一个对象 emit 出一个信号的时候,它就是一个 sender,系统会记录下当前是谁 emit 出这个信号,所以你在对应的 slot 里就可以通过 sender() 就能得到当前是谁 invoke 了你的slot。

函数原型:

1
QObject *QObject::sender() const

返回发送信号对象的指针,类型为 QObject *

什么时候用到 sender()?

有可能多个Object的signal会连接到同一个slot,例如多个Button的clicked()信号连接到同一个slot函数onClick(),因此这是就需要判断到底是哪个对象emit了这个signal,根据sender的不同来进行不同的处理。

示例代码:

1
QPushButton *btn = qobject_cast<QPushButton *>(sender());

此时可以对btn进行进一步的处理了。

你在一个槽里面,调用这个函数,返回的就是你信号来源的对象;

1
2
3
4
5
6
QPushButton *btn = new QPushButton(this);
connect(btn, SIGNAL(clicked()), this, SLOT(onBtnClicked());

void onBtnClicked() {
QPushButton *s = qobject_cast<QPushButton *>(sender());
}