首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt:使用uic生成ui_类,按类名动态加载

Qt:使用uic生成ui_类,按类名动态加载
EN

Stack Overflow用户
提问于 2015-11-22 14:11:17
回答 2查看 446关注 0票数 0

是否可以通过类名动态加载由uic生成的.ui类?我需要决定动态加载哪个UI类。在编译时,我没有这些信息。我不想使用QUiLoader。相反,我想通过字符串将直接进场与QMetaType对象实例化结合起来。

也就是说。

  1. 将UI文件添加到项目文件中的窗体中,
  2. 为QMetaType usage Q_DECLARE_METATYPE(Ui::planar_break)或Q_DECLARE_METATYPE(Ui_planar_break)声明UI类
  3. 然后根据用户操作动态地形成一个字符串类名:"Ui::planar_break“或"Ui_planar_break”。
  4. 并调用以下函数来获取UI小部件指针以供使用?

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::未知数类型每次。想法?谢谢。

(嗯,不知道为什么我的函数在这里不显示为代码块,直到我把它作为引号。)

EN

回答 2

Stack Overflow用户

发布于 2015-11-23 16:05:42

uic创建C++代码。如果您真的希望在运行时动态地从xml文件中创建一个小部件/对话框,那么您需要使用Qt工具。类QUiLoader可能是您要寻找的。如果这样做,您可以通过QWidget::findChild查询创建的QWidget,只要您给出小部件不同和有意义的对象名称,就可以通过QObject::findChild()与UI项交互。

票数 1
EN

Stack Overflow用户

发布于 2015-11-23 20:43:18

本质上,基于对Freenode #qt频道的讨论,我认为我所要求的实际上是不可行的。

我的理解是,即使我能够编译C++头并使用qRegisterMetaType()注册类,甚至还可以使用QMetaType实例化它们,实际构建UI也必须在实例上调用setupUi()。

由于UI文件没有实现包含setupUi的公共接口,而且我不知道要实例化哪个类的编译时间,所以调用setupUi变得不可能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33855711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档