在qt里,有这样的场合: 多个对象的信号连接到同一个槽函数,有时在槽函数里需要获取发出信号的对象的属性。而槽函数通常是由信号触发的,所以只要找到发出信号的对象即可。
QObject *QObject::sender() const
//函数用于在槽函数里获取发出信号的对象的地址。
QObject是QT类里的基类,通过还需要用qobject_cast<类型*>(QObject::sender())把发出信号对象的地址转换成我们所用的对象类型的地址。
qobject_cast与强转不同,强转不会检查类型的,而qobject_cast会检查要转换成的类型是否是此类或它的派生类。
如在程序里,自定义的按钮类的所有对象共用一个槽函数,在槽函数里获取发出信号的对象的属性
mywin.h
#ifndef MYWIN_H
#define MYWIN_H
#include <QWidget>
#include <QPushButton>
#include <QVBoxLayout>
#include <QDebug>
class MyBtn : public QPushButton
{
Q_OBJECT
public:
MyBtn(QString txt, QWidget *parent=NULL) : QPushButton(txt, parent)
{
connect(this, SIGNAL(clicked(bool)), this, SLOT(slot_btn()));
}
public slots:
void slot_btn()
{
MyBtn *btn = qobject_cast<MyBtn *>(sender());
if (btn != NULL)
qDebug() << btn->text();
}
};
class MyWin : public QWidget
{
Q_OBJECT
private:
MyBtn *btn1, *btn2, *btn3;
QVBoxLayout *vlayout;
public:
explicit MyWin(QWidget *parent = 0);
~MyWin();
signals:
public slots:
};
#endif // MYWIN_H
mywin.cpp
#include "mywin.h"
#include <QDebug>
MyWin::MyWin(QWidget *parent) : QWidget(parent)
{
btn1 = new MyBtn("btn1");
btn2 = new MyBtn("btn2");
btn3 = new MyBtn("btn3");
vlayout = new QVBoxLayout(this);
vlayout->addWidget(btn1);
vlayout->addWidget(btn2);
vlayout->addWidget(btn3);
resize(320, 240);
}
MyWin::~MyWin()
{
delete btn1;
delete btn2;
delete btn3;
delete vlayout;
}