2010-03-23 113 views
6

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

回答

0

您可以将元类的实例,你需要在一个哈希或地图,然后通过什么名字,你将它们存储在

0

对于你的情况适合的解决方案可以使用Qt的插件机制检索它们。它提供了轻松加载共享/动态库的功能,并检查它是否包含某个所需接口的实现(如果有的话) - 创建实例。详情可以在这里找到:How to Create Qt Plugins

1

你应该可以用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; 
} 
1

我最近一直面临同样的问题。我需要元对象而不必创建类本身的一个实例。我能做的最好的事情是创建一个全局/静态函数,该函数根据类名称检索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

如果有人有一个更好的选择,欢迎交流!

-1

您还可以看看功能:QMetaType::metaObjectForType

回报QMetaType ::元对象类型

更新:这是我的代码,它创建的类名称的类。 (请注意,类必须与qRegisterMetaType(注册或者是QObject的基地)

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