Qt元對象系統是Qt的核心部分,實現信號與槽函數的綁定及調用,保存對象運行時信息和動態屬性。
Qt元對象系統的實現依賴3部分:
(1)繼承自QObject
(2)聲明宏Q_OBJECT
(3)使用moc編譯(生成文件moc_xxx.h)
QMetaObject:
元對象基類,包含元對象信息。
在運行時,繼承自QObject的類可以使用QObject::metaObject()獲取對象的元對象QMetaObject。使用最多的成員函數有:
a. className():獲取類名
b.superClass():獲取父對象MetaObject
c.method() 和 methodCount():提供元方法(信號、槽函數和invokable函數)
d.enumerator()和enumeratorCount():枚舉類型
e.propertyCount()和property():提供類屬性
f.constructor()和constructorCount():提供元對象構造
//QObject替換爲繼承自QObject的子類
const QMetaObject *metaObject = QObject.metaObject();
Q_ASSERT(metaObject != nullptr);
qInfo() << metaObject->className();
qInfo() << metaObject->superClass()->className();
qInfo() << "---------------------------";
for(int i = 0; i < metaObject->classInfoCount(); ++i)
qInfo() << "classInfo:" << metaObject->classInfo(i).name();
qInfo() << "---------------------------";
for(int i = 0; i < metaObject->methodCount(); ++i)
qInfo() << "method:" << metaObject->method(i).name();
qInfo() << "---------------------------";
for(int i = 0; i < metaObject->enumeratorCount(); ++i)
qInfo() << "enumerator:" << metaObject->enumerator(i).name();
qInfo() << "---------------------------";
for(int i = 0; i < metaObject->propertyCount(); ++i)
qInfo() << "property:" << metaObject->property(i).name();
qInfo() << "---------------------------";
for(int i = 0; i < metaObject->constructorCount(); ++i)
qInfo() << "constructor:" << metaObject->constructor(i).name();
QMetaClassInfo
自定義類信息,在代碼中增加Q_CLASSINFO說明,例如:
Q_CLASSINFO("author", "haha")
通過QMetaClassInfo::name()和QMetaClassInfo::value()訪問。
QMetaMethod
元方法,包括信號、槽函數和invokable函數(qml調用)
QMetaEnum
枚舉類型,調試時可用來打印枚舉類型的字符串
QMetaProperty
元屬性
屬性值需要使用宏聲明,例如:
語法規則:
Q_PROPERTY(type name
(READ getFunction [WRITE setFunction] |
MEMBER memberName [(READ getFunction | WRITE setFunction)])
[RESET resetFunction]
[NOTIFY notifySignal]
[REVISION int]
[DESIGNABLE bool]
[SCRIPTABLE bool]
[STORED bool]
[USER bool]
[CONSTANT]
[FINAL])