Qt动态属性系统源码分析

动态属性系统

在标准C++中,为了保证封装性,我们经常声明一个私有变量,然后声明两个公有函数,即set函数和get函数。在Qt中我们可以使用宏Q_PROPERTY()来实现这些。
一个属性可以使用常规函数QObject::property()和QObject::setProperty()进行读写,不用知道属性所在类的任何细节,除了属性的名字。
Q_PROPERTY()原型:
在这里插入图片描述

具体实现

在这里插入图片描述
//属性设置的头文件.h

class MyProperity : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString mask READ mask WRITE setMask NOTIFY maskChanged)
public:
    explicit MyProperity(QObject *parent = nullptr);
    QString mask()const;          //读属性,获取
    void setMask(QString maskNum);//设置属性,在cpp中实现


signals:
    void maskChanged(QString str);//属性变更时发射的信号
public slots:
private:
    QString m_mask;               //保存属性值
};

在另外的一个头文件中添加槽方法用来响应发射的方法(相应maskChanged(QString str
在这里插入图片描述
cpp添加头文件:添加槽方法定义
在这里插入图片描述
main方法:
设置和读取可以通过本对象,也可以通过父类指针:
①myp1->mask();//直接利用对象进行读取数据
②myp1->setMask(“200000万个口罩”);//直接利用对象指针进行改变
③obj->property(“mask”);//利用父类指针进行读取
④obj->setProperty(“mask”,“3000000万个口罩”);//利用父类指针进行改值,同样会发射信号

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);


    MyProperity *myp1=new MyProperity;
    MyProperity *myp2=new MyProperity;
    QObject *obj=myp1;
    QObject *obj2=myp2;
    connect(myp1,SIGNAL(maskChanged(QString&)),this,SLOT(maskNum(QString&)));//建立连接
    myp1->setMask("200000万个口罩");//直接利用对象指针进行改变
    qDebug()<<"mpy1 mask number:"<<myp1->mask();//直接利用对象进行读取数据
    
    qDebug()<<"obj->mpy1 mask number:"<<obj->property("mask");//利用父类指针进行读取
    qDebug()<<"obj->mpy1 mask number:"<<obj->property("mask").toString();//利用父类指针读取,改变类型
    obj->setProperty("mask","3000000万个口罩");//利用父类指针进行改值
    
    qDebug()<<"obj2->mpy2 mask number:"<<obj2->property("mask").toString();
}

运行结果:
在这里插入图片描述
总结:
为了实现不同模块的开发,我们如果有这么一个动态属性,就只要知道属性的名称就算不知道对应类的一些细节我们也同样可以操作(进行改值和获取值),会方便很多。
设置了的动态属性会注册到元对象系统中是针对与当前的实例,会添加到QObject中但是不会添加到QMetaObject中,不会实现共享(所以不同的实例有不同的结果mask1和mask2动态属性对象的值不同)

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值