QT的metaobject十分有意思,有了它,QT才能支持Property、信号槽、RTTI。
链接http://www.360doc.com/content/13/0313/13/9200790_271228159.shtml对MetaObject系统有一些简单介绍,总结如下:
QMetaObject中的d成员变量存储了metaobject信息
struct { // private data
const QMetaObject *superdata;
const char *stringdata;
const uint *data;
const void *extradata;
} d;
其中data指向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
// revision 5 introduces changes in normalized signatures, no new members
// revision 6 added qt_static_metacall as a member of each Q_OBJECT and inside QMetaObject itself
因此,当QObject中的QMetaObject对象初始化完毕后,我们就可以调用QMetaObject的例如propertyCount这样的成员函数获取一些重要的信息了。
这些信息能够成功地仿如QMetaObject中是有前提的
我们的类需要直接或者间接继承QObject,并在头文件中声明Q_OBJECT宏。
这样程序在qmake过程中会使用moc工具将Q_OBJECT展开,生成已moc_开头的文件。
这个文件中提供了许多有用的信息,其中最重要的是两个数组:
static const uint qt_meta_data_StageControl[] = {
// content:
6, // revision
0, // classname
2, 14, // classinfo
0, 0, // methods
1, 18, // properties
1, 21, // enums/sets
0, 0, // constructors
0, // flags
0, // signalCount
// classinfo: key, value
17, 13,
25, 22,
// properties: name, type, flags
17, 29, 0x0a095003,
// enums: name, flags, count, data
37, 0x1, 6, 25,
// enum data: key, value
45, uint(StageControl::Axis_X),
52, uint(StageControl::Axis_Y),
59, uint(StageControl::Axis_Z),
66, uint(StageControl::Axis_R),
73, uint(StageControl::Axis_T),
80, uint(StageControl::Axis_2D),
0 // eod
};
static const char qt_meta_stringdata_StageControl[] = {
"StageControl\0jin\0name\0""35\0age\0QString\0"
"AxisIds\0Axis_X\0Axis_Y\0Axis_Z\0Axis_R\0"
"Axis_T\0Axis_2D\0"
};
上述的信息其实都是moc自动生成的,一般不需要去检查。