ClassInfo 和 Property在源码中的定义:
MOC生成的字符串结构
MOC生成的uini数组结构
QMetaClassInfo 的定义:
class Q_CORE_EXPORT QMetaClassInfo
{
public:
Q_DECL_CONSTEXPR inline QMetaClassInfo() : mobj(Q_NULLPTR), handle(0) {}
const char *name() const;
const char *value() const;
inline const QMetaObject *enclosingMetaObject() const { return mobj; }
private:
const QMetaObject *mobj;
uint handle;
friend struct QMetaObject;
};
实现:
const char *QMetaClassInfo::name() const
{
if (!mobj)
return 0;
return rawStringData(mobj, mobj->d.data[handle]); 第一个Int值是名字字符串索引
}
/*!
Returns the value of this item.
\sa name()
*/
const char* QMetaClassInfo::value() const
{
if (!mobj)
return 0;
return rawStringData(mobj, mobj->d.data[handle + 1]); 第二个是值字符串索引
}
QMetaProperty的定义
class Q_CORE_EXPORT QMetaProperty
{
public:
QMetaProperty();
const char *name() const;
const char *typeName() const;
QVariant::Type type() const;
int userType() const;
int propertyIndex() const;
bool isReadable() const;
bool isWritable() const;
bool isResettable() const;
bool isDesignable(const QObject *obj = Q_NULLPTR) const;
bool isScriptable(const QObject *obj = Q_NULLPTR) const;
bool isStored(const QObject *obj = Q_NULLPTR) const;
bool isEditable(const QObject *obj = Q_NULLPTR) const;
bool isUser(const QObject *obj = Q_NULLPTR) const;
bool isConstant() const;
bool isFinal() const;
bool isFlagType() const;
bool isEnumType() const;
QMetaEnum enumerator() const;
bool hasNotifySignal() const;
QMetaMethod notifySignal() const;
int notifySignalIndex() const;
int revision() const;
QVariant read(const QObject *obj) const;
bool write(QObject *obj, const QVariant &value) const;
bool reset(QObject *obj) const;
QVariant readOnGadget(const void *gadget) const;
bool writeOnGadget(void *gadget, const QVariant &value) const;
bool resetOnGadget(void *gadget) const;
bool hasStdCppSet() const;
inline bool isValid() const { return isReadable(); }
inline const QMetaObject *enclosingMetaObject() const { return mobj; }
private:
int registerPropertyType() const;
const QMetaObject *mobj;
uint handle;
int idx;
QMetaEnum menum;
friend struct QMetaObject;
friend struct QMetaObjectPrivate;
};