是否可以通过类名动态加载由uic生成的.ui类?我需要决定动态加载哪个UI类。在编译时,我没有这些信息。我不想使用QUiLoader。相反,我想通过字符串将直接进场与QMetaType对象实例化结合起来。
也就是说。
QWidget* initiateClassByName(QString名称){ int id = QMetaType::type(name.toLatin1());QWidget* widget=nullptr;if (id != QMetaType::UnknownType) { widget=static_cast< QWidget* > (QMetaType::create(id));//QMetaType: return (id,myClassPtr);//myClassPtr = 0;}返回小部件;}
与每次实例化特定对话框时动态加载十几个UI文件(存储在Qt资源文件中)相比,我试图提高性能。当我这样做,我似乎得到一个QMetaType::未知数类型每次。想法?谢谢。
(嗯,不知道为什么我的函数在这里不显示为代码块,直到我把它作为引号。)
发布于 2015-11-23 16:05:42
uic创建C++代码。如果您真的希望在运行时动态地从xml文件中创建一个小部件/对话框,那么您需要使用Qt工具。类QUiLoader可能是您要寻找的。如果这样做,您可以通过QWidget::findChild查询创建的QWidget,只要您给出小部件不同和有意义的对象名称,就可以通过QObject::findChild()与UI项交互。
发布于 2015-11-23 20:43:18
本质上,基于对Freenode #qt频道的讨论,我认为我所要求的实际上是不可行的。
我的理解是,即使我能够编译C++头并使用qRegisterMetaType()注册类,甚至还可以使用QMetaType实例化它们,实际构建UI也必须在实例上调用setupUi()。
由于UI文件没有实现包含setupUi的公共接口,而且我不知道要实例化哪个类的编译时间,所以调用setupUi变得不可能。
https://stackoverflow.com/questions/33855711
复制相似问题