Qt类的元数据

所谓元数据metadata,为描述数据的数据(data about data),主要是描述数据属性(property),对于一个对象来说,它的属性信息是类的名字、数据的名字、方法的名字等属性。

使用对象的元数据,可以在运行时由一个对象获取它的类的信息,使用这些信息可以再运行时将类实例化、调用类的方法。


Qt提供了获得对象元数据的方法,它提供一个QMetaObject的对象,包含如下数据:
        const QMetaObject *superdata; //指向母类的对象的metaObject
        const char *stringdata;            //类名字
        const uint *data;                    //这个是一个整形数组,保存了很多东西
        const void *extradata;             //

//这是类名字的一个方法,这个名字是moc编译器生成的,并且将值赋给元数据对象的
static const char qt_meta_stringdata_MainWindow[] = {
    "MainWindow00newFile()0open()0bool0"
    "save()0saveAs()0about()0documentWasModified()0"
};

//这是data的一个实例,这个也是moc编译器生成的,并且将值赋给元数据对象的
static const uint qt_meta_data_MainWindow[] = {
 // content:
       4,       // revision
       0,       // classname
       0,    0, // classinfo
       6,   14, // methods
       0,    0, // properties
       0,    0, // enums/sets
       0,    0, // constructors
       0,       // flags
       0,       // signalCount

 // slots: signature, parameters, type, tag, flags
      12,   11,   11,   11, 0x08,
      22,   11,   11,   11, 0x08,
      34,   11,   29,   11, 0x08,
      41,   11,   29,   11, 0x08,
      50,   11,   11,   11, 0x08,
      58,   11,   11,   11, 0x08,

       0        // eod
};

要支撑这个meta-object system,moc功不可没,因为标准C++编译器根本就不会自动为对象保存这些元信息。除了metaObject的数据外,moc做到了更多。下面的这些宏都是给moc定义的,他们都不是普通的C++的宏。
Q_SLOTS
Q_SIGNALS
Q_CLASSINFO(name, value)
Q_INTERFACES(x)
Q_PROPERTY(text)
Q_OVERRIDE(text)
Q_ENUMS(x)
Q_FLAGS(x)
#ifdef QT3_SUPPORT
Q_SETS(x)
#endif
Q_INVOKABLE
Q_SIGNAL
Q_SLOT

metaObject内的重要函数:
1、newInstance()
    调用newInstance函数构造对象,Qt会在相应类的定义为Q_INVOKABLE的构造函数中寻找参数合适的构造函数,如果没有选到合适,返回0,否则使用对应的构造函数构造一个对象,返回对象指针。

 

2、invokeMethod()
    调用类中的signal和slot

 

3、QMetaMethod method(int index)
    返回类的方法,QMetatMethod提供了invoke方法供调用相应的方法。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值