c++ - Qt:使用uic生成ui_类,通过类名动态加载

标签 c++ qt

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

  1. 将UI文件添加到项目文件中的FORMS,
  2. 声明用于 QMetaType 使用的 UI 类 Q_DECLARE_METATYPE(Ui::planar_break) 或 Q_DECLARE_METATYPE(Ui_planar_break)
  3. 然后根据用户操作动态形成一个字符串类名:“Ui::planar_break”或“Ui_planar_break”
  4. 并调用以下函数来获取 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/

相关文章:

c++ - 为什么执行 socket::readyRead() 的新信号,即使其较早的插槽仍在处理中?

java - C++ 中的 Hashmap 等价物

c++ - DTracing objc_msgSend 不打印接收者类名

linux - 我可以在 Ubuntu 中安装 Qt 4.8.1 和 Qt 5.2.1 IDE 吗?

c++ - 在带有符号链接(symbolic link)的可执行文件中使用相对路径

c++ - 即使删除线程,线程数也会增加很多

c++ - OpenGL 奇怪的渲染行为(闪烁的面孔)

C++ 组合最佳实践

java - 在 Ubuntu Linux 中查找 C/C++ 源代码的最佳工具是什么?

c++ - 如何将元素插入 multimap ?