Qt元對象系統(The Meta-Object System)

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])

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章