8

给定类名,有没有办法找到类的 QMetaObject 实例?我喜欢做的是从磁盘加载对象,但要做到这一点,我需要一种使用类名检索 QMetaObject 实例的方法,以便使用 QMetaObject 创建实例。

4

5 回答 5

4

您应该能够使用QMetaType做到这一点。您可能需要Q_DECLARE_META_TYPE()和/或qRegisterMetaType()让您的类型为人所知。然后它应该大致像链接中的这个例子一样工作:

 int id = QMetaType::type("MyClass");
 if (id == 0) {
     void *myClassPtr = QMetaType::construct(id);
     ...
     QMetaType::destroy(id, myClassPtr);
     myClassPtr = 0;
 }
于 2011-09-21T12:33:30.870 回答
2

我最近也面临同样的问题。我需要元对象,而不必创建类本身的实例。我能做的最好的事情是创建一个全局/静态函数来检索给定类名的 qmetaobject。我通过使用 QObject::staticMetaObject 实现了这一点。

QMetaObject GetMetaObjectByClassName(QString strClassName)
{
    QMetaObject metaObj;
    if (strClassName.compare("MyClass1") == 0)
    {
        metaObj = MyClass1::staticMetaObject;
    }
    else if (strClassName.compare("MyClass2") == 0)
    {
        metaObj = MyClass2::staticMetaObject;
    }
    else if (strClassName.compare("MyClass3") == 0)
    {
        metaObj = MyClass3::staticMetaObject;
    }
    else if (strClassName.compare("MyClass4") == 0)
    {
        metaObj = MyClass4::staticMetaObject;
    }
    else if (strClassName.compare("MyClass5") == 0)
    {
        metaObj = MyClass5::staticMetaObject;
    }

    // and so on, you get the idea ...

    return metaObj;
}

请参阅:http ://doc.qt.io/qt-5/qobject.html#staticMetaObject-var

如果有人有更好的选择,请分享!

于 2015-09-09T07:58:44.420 回答
0

对于您的情况,适当的解决方案可以使用 Qt 插件机制。它提供了轻松加载共享/动态库并检查它是否包含某些所需接口的实现的功能,如果是,则创建实例。详细信息可以在这里找到:如何创建 Qt 插件

于 2011-09-21T09:58:08.793 回答
0

您可以将所需的 MetaClass 实例存储在 Hash 或 Map 中,然后通过存储它们的任何名称检索它们

于 2010-04-07T02:17:33.710 回答
-1

你也可以看看函数:QMetaType::metaObjectForTypewhich

为类型返回 QMetaType::metaObject

更新:这是我的代码,它按类名创建一个类。(注意这个类必须用 qRegisterMetaType 注册(或者是 QObject base)

int typeId = QMetaType::type("MyClassName");
const QMetaObject *metaObject = QMetaType::metaObjectForType(typeId);
QObject *o = metaObject->newInstance();
MyClassName *myObj = qobject_cast<MyClassName*>(o);

更新2:我忘了说。Yout 类的构造函数必须标记为Q_INVOKABLE

于 2015-10-31T16:42:47.213 回答