如何仅从类名获取QMetaObject

How I can get QMetaObject from just class name?

本文关键字:获取 QMetaObject 何仅      更新时间:2023-10-16

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

您要求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会处理好这一点?使用风险自负。

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

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

另请参阅以下Qt5 API文档:

  • QMetaObject::type(const char*)
  • QMetaObject::metaObjectForType(int)