12 qt的反射机制应用

在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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值