现在的位置: 首页 > 综合 > 正文

元对象系统的整体结构分析

2013年10月02日 ⁄ 综合 ⁄ 共 1806字 ⁄ 字号 评论关闭

注:此文是从我的QQ空间里移出来的,因为觉的用那么多空间,blog了太累了,它发表于    2009年12月31日 13:58

-----------------------------------------------------------------------------------------------------------------------------------------------------

本文转自:我朋友的QQ空间,如需要转载,请注明本地址

 

 

元对象系统的整体结构分析

忙了一天了,终于有时间清静下来,可以做下自己的事情了。今天继续分析我们的元对象系统。

今天的入手点还是在qmetaobject.h文件,昨天看到了QMetaMethod类,总的来说,该类就是提供了一种新的函数调用方法,至于其中的具体实现,在今后的分析中继续研究了。接下来是QMetaEnum类,该类的主要功能是将元对象系统中的名字与id相对应。QMetaProperty类则是负责属性部分,QMetaClassInfo保存了类信息。QMetaObjectPrivate类则是真正负责系统核心实现的部分。

分析,从QMetaObjectPrivate类的定义开始:

int revision;

    int className;

    int classInfoCount, classInfoData;

    int methodCount, methodData;

    int propertyCount, propertyData;

    int enumeratorCount, enumeratorData;

    int constructorCount, constructorData; //since revision 2

    int flags; //since revision 3

    int signalCount; //since revision 4

QMetaObjectPrivate类定义了struct类型,这样,所有变量都是公用的,我们先从字面上猜测一下其含义:

int revision;这个单词是修订的意思,具体含义不是很明白;

int className;这个很明显了,保存了对应类的类名,

int classInfoCount, classInfoData;这两个应该是保存类相关信息的,可能会与元对象编译器生成的那个文件中一开始的结构体相关。

int methodCount, methodData;同上

int propertyCount, propertyData; 同上

int enumeratorCount, enumeratorData; 同上

int constructorCount, constructorData; //since revision 2同上

int flags; //since revision 3

int signalCount; //since revision 4

结合这里,我想就比较清楚了:

static const uint qt_meta_data_MainWindow[] = {

 // content:

       4,       // revision

       0,       // classname

       0,    0, // classinfo

       4,   14, // methods

       0,    0, // properties

       0,    0, // enums/sets

       0,    0, // constructors

       0,       // flags

       2,       // signalCount

 

 // signals: signature, parameters, type, tag, flags

      12,   11,   11,   11, 0x05,

      20,   11,   11,   11, 0x05,

 

 // slots: signature, parameters, type, tag, flags

      25,   11,   11,   11, 0x09,

      38,   11,   11,   11, 0x09,

 

       0        // eod

};

好了,今天就只能分析到这里了,电池没电了,也太累了,需要休息,明天继续。

抱歉!评论已关闭.