(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)
谢谢
1343

被折叠的 条评论
为什么被折叠?



