QT6 源(12):重要基类 QMetaProperty 的源码,并记录与注释其重要的成员函数的功能

(1)如何找到该 QMetaProperty 类的定义, #include 《QMetaProperty》,即可找到,是在 qmetaobject.h 头文件里

class Q_CORE_EXPORT QMetaProperty
{
private: //先看其私有成员,其中才有重要的类数据成员的定义
    int registerPropertyType() const; //此函数不会被外界调用

    struct Data {  // 定义了类中类
        enum { Size = 5 }; //这种枚举类,是可以不定义枚举对象而直接使用枚举类成员的
		const uint * d   ; //定义了一个数据指针,可以指向一个数组
		
        uint name() const { return d[0]; }      //返回属性名字
        uint type() const { return d[1]; }      //返回属性类型
        uint flags() const { return d[2]; }     //返回属性标志
        uint notifyIndex() const { return d[3]; } 
        uint revision() const { return d[4]; }  //再次查看,修正;修改 revision

        int index(const QMetaObject * mobj) const; //似乎是要返回一个属性索引值
    };

    Data data;  // 定义了元属性的数据成员
    const QMetaObject * mobj;  //定义了一个指针
    QMetaEnum menum; //通过此数据成员可以获取元属性对象的枚举方面的信息

    QMetaProperty(const QMetaObject *mobj, int index); //本类的私有构造函数
    static Data getMetaPropertyData(const QMetaObject *mobj, int index);
	//私有的静态函数,不会被外界感知
	
    friend struct QMetaObject;  //友元类
    friend struct QMetaObjectPrivate;
    
public: //本类的无参构造函数。以下开始进入有用的公共函数环节
    constexpr QMetaProperty() : mobj(nullptr), data({ nullptr }) {}

    //bool QObject::setProperty (const char * name, const QVariant &value);
    //QVariant QObject::property(const char * name) const; //由属性名得属性值
    //但可见,本类 QMetaProperty 提供了关于元对象属性的更多信息
    const char * name() const;  //返回属性名
    const char * typeName() const; //返回本属性的类型
    //如 Q_PROPERTY(QString abc READ abc WRITE setabc)
	//则 typeName() 返回 "QString",name()返回 "abc"

#if QT_DEPRECATED_SINCE(6, 0)
	//QT_DEPRECATED_SINCE 是 Qt框架中的一个宏,
	//用于标记某个函数、类或成员在特定版本后被弃用。
	//它向开发者发出警告,提示他们在使用已被弃用的功能时应考虑替代方案。
    QT_WARNING_PUSH
    QT_WARNING_DISABLE_DEPRECATED
    QT_DEPRECATED_VERSION_6_0
    QVariant::Type type() const
    {   int t = userType(); 
    	return t >= QMetaType::User ?
    	         QVariant::UserType : 
    	         QVariant::Type(t); 
    }
    QT_WARNING_POP
#endif
	
	QMetaType metaType() const;  //返回本属性的 QMetaType 方面的信息
	int typeId() const { return metaType().id(); } 
	//返回属性的存储类型。这与metaType().id()相同。
    int userType() const { return typeId(); } //返回此属性的用户类型。
    //返回值是 QMetaType 中注册的一个值。这相当于metaType().id()
    int propertyIndex() const;   //返回此属性的索引。
    int relativePropertyIndex() const; //返回此属性在包含元对象中的相对索引。
    //Returns this property's index relative within the enclosing meta object.

    bool isReadable() const; //如果此属性是可读的,则返回 true;否则返回 false。
    bool isWritable() const; //如果此属性是可写的,则返回 true;否则返回 false。
    bool isResettable() const;//若此属性可重置为默认值,则返true;否则返 false。
    bool isDesignable() const;//若QPROPERTY()的 DESIGNABLE属性为假,则返假;否则返真。
    bool isScriptable() const;//若QPROPERTY()的 SCRIPTABLE属性为假,则返假;否则返真。
    bool isStored() const; //如果属性已存储,则返回 true;否则返回 false。
	//如果O PROPERTY()的STORED 属性为 false,则该函数返回 false;否则返回 true。
    bool isUser() const; //如果OPROPERTY()的 USER属性为假,则返回假。否则返回真,
    //表示该属性被指定为 USER 属性,即用户可以编辑的属性或具有其他重要性的属性。
    bool isConstant() const; //如果属性是常量,则返回 true;否则返回 false。
	//如果设置了QPROPERTY()的CONSTANT属性,则该属性为常量。
    bool isFinal() const; //如果属性是最终的,则返回 true;否则返回 false。
	//如果OPROPERTY()的FINAL属性被设置,则属性是最终的。
    bool isRequired() const; //如果属性是必需的,则返回 true;否则返回 false。
	//如果一个属性的QPROPERTY()的 REQUIRED 属性被设置,那么这个属性就是最终的。
    bool isBindable() const; 
    //如果OPROPERTY()暴露了绑定功能,则返回 true;否则返回 false。
	//这意味着您可以创建使用此属性作为依赖项的绑定,
	//或者在此属性上安装QPropertyObserver对象。
	//除非该属性是只读的,否则您还可以在此属性上设置绑定。

    bool isFlagType() const; 
    //如果属性的类型是一个用作标志的枚举值,则返回 true;否则返回 false。
	//可以使用 OR 运算符组合标志。标志类型也是隐式枚举类型。
    bool isEnumType() const; //如果属性的类型是枚举值,则返回 true;否则返回 false。
    QMetaEnum enumerator() const; 
    //如果此属性的类型是枚举类型,则返回枚举器,否则,返回值未定义。

    bool hasNotifySignal() const;
    //如果此属性具有相应的更改通知信号,则返回true,否则返回 false。
    QMetaMethod notifySignal() const;
    //如果指定了属性更改通知信号,则返回该信号的QMetaMethod实例,否则返回无效的QMetaMethod。
    int notifySignalIndex() const;
    //如果指定了属性更改通知信号,则返回该信号的索引,否则返回-1。

    int revision() const;//如果通过 REVISION 指定了属性修订,则返回修订,否则返回 0。

    QVariant read(const QObject *obj) const;
    //从给定的对象中读取属性的值。如果读取成功,则返回值;否则返回无效变体 Variant。
    bool write(QObject *obj, const QVariant &value) const;
    //将值作为属性的值写入给定的对象。如果写入成功则返回true;否则返回false。
	//如果值与属性的类型类型不同,则会尝试进行转换。
	//如果此属性可重置,则空QVariant()相当于调用 reset(),否则相当于设置一个默认构造的对象。
    bool reset(QObject *obj) const;
    //使用重置方法重置给定对象的属性。如果重置成功,则返回true;否则返回false。
	//重置方法是可选的;只有少数属性支持它们。

    QUntypedBindable bindable(QObject *object) const;
    //返回给定对象上属性的可绑定接口。如果属性不支持绑定,则返回的接口将是无效的。

    QVariant readOnGadget(const void *gadget) const;
    //从给定的小部件中读取属性的值。如果能够读取,则返回值,否则返回无效变体。
	//只有当这是Q GADGET的属性时,才应该使用此函数。
    bool writeOnGadget(void *gadget, const QVariant &value) const;
    //将值作为属性的值写入给定的设备。如果写入成功则返回true;否则返回false。
    bool resetOnGadget(void *gadget) const;

    bool hasStdCppSet() const;
    bool isAlias() const;
    //如果此属性有效(可读),则返回 true;否则返回 false。
    inline bool isValid() const { return isReadable(); }
    
    inline const QMetaObject *enclosingMetaObject() 
    const { return mobj; } //返回本属性对象里封装的  QMetaObject * 指针


};

(2)给出本类的引出途径,调用途径

在这里插入图片描述

(3)

谢谢

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangzhangkeji

谢谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值