QMetaObject使用

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自动生成的,一般不需要去检查。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值