我怎样才能从类名中获取QMetaObject?

时间:2011-06-07 00:02:46

标签: c++ qt

我需要获取QMetaObject来动态创建对象实例。 如果我知道对象,那么QObject :: metaObject()就是我需要的。如果我知道该类,那么我可以使用QObject :: staticMetaObject变量。但是如果我只知道类名作为字符串值,我该怎么用?

2 个答案:

答案 0 :(得分:3)

您要求QMetaObject,但要说它是出于创作目的。如果这就是你所要做的,QMetaType可能就是你所需要的。你必须用它来注册你的类型,但我很确定QT没有QMetaObject的主列表,默认情况下只是浮动,所以无论你做什么,这样的注册都是必要的。

QMetaType::Type id = QMetaType::type("ClassName");
if(id == 0)
    throw something_or_whatever;
ClassName* p = (ClassName*)QMetaType::construct(id);
//act on p
QMetaType::destroy(id, p);

粗略地看一下文档并不清楚如何分配p的内存,但我认为destroy负责这个?使用风险自负。

答案 1 :(得分:1)

从Qt5开始,仅从类名获取QMetaObject就变得很简单:

int typeId = QMetaType::type("MyClassName");
const QMetaObject *metaObject = QMetaType::metaObjectForType(typeId);
if (metaObject) {
    // ...
}

另请参阅以下Qt5 API文档: