有没有办法找到类的QMetaObject实例,给定类名?我喜欢做的是从磁盘加载对象,但为了实现这一点,我需要一种方法来使用类的名称来检索QMetaObject实例,以便使用QMetaObject来创建一个实例。如何从类名称中找到Qt元对象实例?
6
A
回答
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
相关问题
- 1. 从类中找到的类的实例的名称
- 2. 如何获得类对象没有实例或类名称
- 3. 从类名称中将对象实例化为字符串
- 4. 从名称实例化类?
- 5. 如何查找类中的类实例变量的名称。
- 6. QT:获取对象的类名称
- 7. 如何实例化给定类名称和基类的对象命名空间
- 8. 类实例名称
- 9. 从对象分配到类实例
- 10. field.get和对象实例名称
- 11. 对象实例的循环名称
- 12. 如何从不完整的类名获取实例化对象?
- 13. python,如何从子实体中找到类对象?
- 14. 如何从Crystal中的字符串名称创建类实例?
- 15. 如何从类别名称中获取类别对象
- 16. 从其对象中类的名称
- 17. 从实例获取类的名称
- 18. C#/ .NET如何从类名中找到包含名称空间
- 19. 如何在ActionScript 3中从类的实例获取类对象?
- 20. 的Java:创建时括号类名称对象实例
- 21. AS3类实例名称
- 22. 如何给实例名称?
- 23. “查找”已知类的对象实例?
- 24. 如何从Python的Datetime对象中查找星期几名称?
- 25. 从类对象实例化类
- 26. 如何从对象中获取Xamarin.Forms元素的名称?
- 27. 找出对象是类对象而不是类的实例
- 28. 从对象名称
- 29. 找不到表对象名称
- 30. 如何从查询对象中获取分类术语名称