在 Qt 中解析元数据时检测方法的来源
Detect method's origin when parsing it's metadata in Qt
我有代码可以解析我编写的 Qt 插件的元数据,该插件通过其界面公开了一些功能。我的插件的mainclass继承自QObject,所以我在读取元数据的时候,也得到了QObject中声明和公开的方法,其中:
destroyed(Object *);
objectNameChanged(QString);
etc...
我只想解析在我的插件的main中引入的方法class,而不是从QObject继承的方法,但是查看QMetaMethod提供的属性,我没有看到方法。我只能访问 QMetaObject 的所有方法,其中也包括 QObject 的方法。
解决这个问题的一种方法也是解析 QObject 的元数据,从我的插件的主要 class 中排除它的方法。那是我最后的手段。我想知道 Qt 是否提供开箱即用的东西。
您可以使用 QMetaObject::methodOffset()
方法获取当前 class 方法开始的索引,然后从那里迭代而不是从索引 0 开始:
const QMetaObject *object = metaObject();
// Gets only methods on the actual class.
for (int i = object->methodOffset(); i < object->methodCount(); ++i) {
qDebug() << object->method(i).methodSignature();
}
// Gets all methods, including super classes.
for (int i = 0; i < object->methodCount(); ++i) {
qDebug() << object->method(i).methodSignature();
}
这是有效的,因为方法编号是有序的,因此所有 super/parent class 方法都在子 class 方法之前。因此,如果您从子 class 方法开始的偏移量开始,您将跳过所有超级 class 方法。
我有代码可以解析我编写的 Qt 插件的元数据,该插件通过其界面公开了一些功能。我的插件的mainclass继承自QObject,所以我在读取元数据的时候,也得到了QObject中声明和公开的方法,其中:
destroyed(Object *);
objectNameChanged(QString);
etc...
我只想解析在我的插件的main中引入的方法class,而不是从QObject继承的方法,但是查看QMetaMethod提供的属性,我没有看到方法。我只能访问 QMetaObject 的所有方法,其中也包括 QObject 的方法。
解决这个问题的一种方法也是解析 QObject 的元数据,从我的插件的主要 class 中排除它的方法。那是我最后的手段。我想知道 Qt 是否提供开箱即用的东西。
您可以使用 QMetaObject::methodOffset()
方法获取当前 class 方法开始的索引,然后从那里迭代而不是从索引 0 开始:
const QMetaObject *object = metaObject();
// Gets only methods on the actual class.
for (int i = object->methodOffset(); i < object->methodCount(); ++i) {
qDebug() << object->method(i).methodSignature();
}
// Gets all methods, including super classes.
for (int i = 0; i < object->methodCount(); ++i) {
qDebug() << object->method(i).methodSignature();
}
这是有效的,因为方法编号是有序的,因此所有 super/parent class 方法都在子 class 方法之前。因此,如果您从子 class 方法开始的偏移量开始,您将跳过所有超级 class 方法。