QT 属性系统

属性系统

属性基础

  1. 属性和数据成员相似。他们的差别在于存取的方式不同,比如属性值通常使用读取函数(get)和设置函数(set)来存取。除此之外QT还有其他方式存取属性值。
  2. 在QT中属性和数据成员是两个不同概念,他们可以有联系也可以没有联系。比如名为a的属性和数据成员a,他们名称相同,但是完全不想管。
  3. 属性值可以通过下面的方式存取
    • 可以使用 QObject::property 和 QObject::setProperty 函数进行存取
    • 属性还可以通过元对象系统的QMetaObject来存取
    • 若属性有相关联的存取函数,则可以使用存取函数来存取

QVariant 类

  1. 使用QObject::property函数可以读取属性值,使用QObject::setProperty 函数可以设置属性
    的值。但是数据类型有很多种,怎么使得property返回的值属于正确的类型呢?QT使用的QVariant 类

  2. QVariant 类用于封装数据成员和值,类似于UNION ,QVariant 对象一次只能保存单一类型的值。

  3. QVariant 具有常用类型的单形参构造函数,所以可以把这些常用数据类型转换为QVariant 类型。也可以直接赋值。

    QVariant v(1)
    v=2.2
    
  4. 获取 QVariant 对象存储的值的类型

    • Type type() const

      获取 QVariant 对象当前存储值的类型,类型以枚举 QMetaType::Type 的形式表示

    • const char * typeName() const;

      以字符串的形式返回QVariant对象存储值的类型。

  5. 获取和设置QVariant对象的值

    • void setValue(const T& v);

    • T value() const;

      把存储对象转换为T类型

    • T toT()

      例如int toInt()

使用QObject类中的成员函数存取属性值 和动态属性

  1. QVariant QObject::property(const char* name) const;

    获取属性名称为name的值

  2. bool QObject::setProperty(const char* name, const QVariant & v);

    把属性name值设置为v 并且返回true

动态属性
  • 若属性没有使用Q_PROPERTY进行声明,就直接把属性添加到对象中,并且返回false,这就是动态属性
  • 动态属性可以使用property进行查询
  • 动态属性是基于某个类的实例的,也就是说动态属性是添加到某个对象中的,而不是添加到QMetaObject中的,这意味着,无法使用QMetaObject获得动态属性的值。
  • 更改动态属性的值,会发送QDynamicPropertyChangeEvent到该对象。

使用反射机制获取属性值

这些属性必须是Q_PROPERTY声明的

  1. QMetaProperty类

    函数说明
    const char* name() const;获取属性的名称
    const char* typeName() const;返回该属性的类型名称
    QVariant::Type type() const;返回属性类型
    int userType() const;返回属性的用户类型
    int propertyIndex() const;返回属性的索引
    QMetaEnum enumerator() const属性是否为枚举类型
    QVariant read(const QObject* object) const;从给性对象读取属性值
    bool write(QObject* object, const QVariant & v) const;将属性值写到指定对象中
    bool reset(QObject* object) const;重置
    bool hasNotifySignal() const;属性是否有通知信号
    QMetaMethod notifySignal() const;
    int notifySignalIndex() const;返回属性通知信号的索引
  2. QMetaObject类中与属性相关的成员函数

    函数说明
    int indexOfProperty(const char* name) const;返回属性的索引
    int propertyCount() const;返回属性的数量(包括从父类继承的属性)
    int propertyOffset() const;返回父类的属性数量
    QMetaProperty property(int index) const;返回索引的元数据
    QMetaProperty userProperty() const;返回USER标志为true的属性的元数据
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值