是否可以通过类名动态加载由 uic 生成的 .ui 类?我需要决定动态加载哪个 UI 类。我在编译时没有这些信息。我不想使用 QUiLoader。相反,我想结合 direct approach here通过字符串实例化 QMetaType 对象。
即
- 将UI文件添加到项目文件中的FORMS,
- 声明用于 QMetaType 使用的 UI 类 Q_DECLARE_METATYPE(Ui::planar_break) 或 Q_DECLARE_METATYPE(Ui_planar_break)
- 然后根据用户操作动态形成一个字符串类名:“Ui::planar_break”或“Ui_planar_break”
- 并调用以下函数来获取 UI 小部件指针以供使用?
QWidget* initiateClassByName(QString name){ int id = QMetaType::type(name.toLatin1()); QWidget* widget=nullptr; if (id != QMetaType::UnknownType) { widget=static_cast< QWidget* > (QMetaType::create(id)); //QMetaType::destroy(id, myClassPtr); //myClassPtr = 0; } return widget; }
与每次实例化特定对话框时动态加载十几个 UI 文件(存储在 Qt 资源文件中)相比,我正在尝试提高性能。当我这样做时,我似乎每次都会得到一个 QMetaType::UnknownType 。想法?谢谢。
(嗯,不确定为什么我的函数在这里没有显示为代码块,直到我将其引用为止。)
最佳答案
uic 创建 C++ 代码。如果你真的想在运行时从 xml 文件动态创建一个小部件/对话框,你需要使用 Qt Ui Tools .类(class)QUiLoader可能是你要找的。如果这样做,您可以通过 QWidget::findChild 查询创建的 QWidget 您可以通过 QObject::findChild() 与 UI 项进行交互,前提是您为小部件指定了独特且有意义的对象名称。
关于c++ - Qt:使用uic生成ui_类,通过类名动态加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33855711/