QUiLoader Class
在运行时加载并实例化Qt Widgets Designer 表单。更多内容...
| 标题: | #include <QUiLoader> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS UiTools) target_link_libraries(mytarget PRIVATE Qt6::UiTools) |
| qmake: | QT += uitools |
| 继承自: | QObject |
公共函数
| QUiLoader(QObject *parent = nullptr) | |
| virtual | ~QUiLoader() override |
| void | addPluginPath(const QString &path) |
| QStringList | availableLayouts() const |
| QStringList | availableWidgets() const |
| void | clearPluginPaths() |
| virtual QAction * | createAction(QObject *parent = nullptr, const QString &name = QString()) |
| virtual QActionGroup * | createActionGroup(QObject *parent = nullptr, const QString &name = QString()) |
| virtual QLayout * | createLayout(const QString &className, QObject *parent = nullptr, const QString &name = QString()) |
| virtual QWidget * | createWidget(const QString &className, QWidget *parent = nullptr, const QString &name = QString()) |
| QString | errorString() const |
| bool | isLanguageChangeEnabled() const |
| QWidget * | load(QIODevice *device, QWidget *parentWidget = nullptr) |
| QStringList | pluginPaths() const |
| void | setLanguageChangeEnabled(bool enabled) |
| void | setWorkingDirectory(const QDir &dir) |
| QDir | workingDirectory() const |
详细说明
使用 QUiLoader 根据 UI 文件(由Qt Widgets Designer 创建)中存储的信息,动态创建基于QWidget 的用户界面。
load() 函数会读取 UI 文件的内容,实例化文件中描述的控件,并返回指向顶级QWidget 的指针。随后可以显示该控件:
MyWidget::MyWidget(QWidget*parent)
: QWidget(parent)
{
QFile file(":/forms/myform.ui");
if(!file.open(QFile::ReadOnly))
qFatal("Cannot open resource file");
QUiLoader loader;
QWidget*myWidget =loader.load(&file, this);
QVBoxLayout*layout = newQVBoxLayout;
layout->addWidget(myWidget);
setLayout(layout);
}如果实例化失败,该函数将返回一个nullptr ;请使用errorString()函数来获取所发生错误的人类可读描述。
加载包含自定义控件的表单
如果 UI 文件包含由Qt Widgets Designer 插件实现的自定义控件,默认情况下加载将失败。要解决此问题,您可以继承QUiLoader 类并重写createWidget() 函数。如果无法实现,您还可以通过addPluginPath() 或QT_PLUGIN_PATH 环境变量添加插件位置,让模块加载Qt Widgets Designer 插件。更多详细信息,请参阅“为Qt Widgets Designer 创建自定义控件”页面。
从 UI 文件中加载特定小部件
您可以从 UI 文件中加载特定的控件,而非整个 UI 文件。使用availableWidgets() 函数获取可用控件的名称,并使用createWidget() 函数实例化特定的控件。例如:
QWidget*loadCustomWidget(constQString&className,QWidget*parent)
{
QUiLoader loader;
QStringList availableWidgets=loader.availableWidgets();
if(!availableWidgets.contains(className)) {
qWarning() << "Cannot create widget" << className;
returnnullptr;
}
returnloader.createWidget(className,parent);
}自定义控件创建
当 QUiLoader 类需要分别创建操作、操作组、布局或控件时,会内部调用createAction()、createActionGroup()、createLayout() 和createWidget() 函数。 您可以继承 QUiLoader 并重写这些函数,以自定义 UI 创建流程。例如,您可能希望在加载表单或创建自定义控件时,列出所创建的操作列表。
示例
有关使用 QUiLoader 类的完整示例,请参阅“计算器构建器”。
另请参阅 Qt UI Tools 以及QFormBuilder 。
成员函数文档
[explicit] QUiLoader::QUiLoader(QObject *parent = nullptr)
使用给定的parent 创建一个表单加载器。
[override virtual noexcept] QUiLoader::~QUiLoader()
摧毁装载机。
void QUiLoader::addPluginPath(const QString &path)
将给定的path 添加到加载器在查找插件时会搜索的路径列表中。
警告:请仅 设置您信任的路径。允许不受信任的用户在指定路径中创建或添加内容可能会导致安全漏洞。
另请参阅 pluginPaths() 和clearPluginPaths()。
QStringList QUiLoader::availableLayouts() const
返回一个列表,其中包含所有可使用createLayout()函数构建的可用布局。
另请参阅 createLayout()。
QStringList QUiLoader::availableWidgets() const
返回一个列表,其中包含所有可通过createWidget()函数构建的可用控件,即给定插件路径中指定的所有控件。
另请参阅 pluginPaths() 和createWidget()。
void QUiLoader::clearPluginPaths()
清除加载器在查找插件时将搜索的路径列表。
另请参阅 addPluginPath() 和pluginPaths()。
[virtual] QAction *QUiLoader::createAction(QObject *parent = nullptr, const QString &name = QString())
使用给定的parent 和name 创建一个新的操作。
QUiLoader 类在创建操作时,内部也会使用该函数。因此,您可以继承QUiLoader 类并重写此函数,以干预用户界面或控件的构建过程。但在您的实现中,请确保先调用QUiLoader 的版本。
另请参阅 createActionGroup()、createWidget() 和load()。
[virtual] QActionGroup *QUiLoader::createActionGroup(QObject *parent = nullptr, const QString &name = QString())
创建一个新的操作组,其parent 和name 参数为给定值。
该函数还被QUiLoader 类在内部用于每次创建操作组时。因此,您可以继承QUiLoader 并重写此函数,以干预用户界面或控件的构建过程。但在您的实现中,请确保先调用QUiLoader 的版本。
另请参阅 createAction()、createWidget() 和load()。
[virtual] QLayout *QUiLoader::createLayout(const QString &className, QObject *parent = nullptr, const QString &name = QString())
使用由className 指定的类,基于给定的parent 和name 创建一个新的布局。
QUiLoader 类在创建布局时也会在内部调用此函数。因此,您可以继承QUiLoader 类并重写此函数,以干预用户界面或控件的构建过程。但在您的实现中,请确保先调用QUiLoader 的版本。
另请参阅 createWidget() 和load()。
[virtual] QWidget *QUiLoader::createWidget(const QString &className, QWidget *parent = nullptr, const QString &name = QString())
使用由className 指定的类,根据给定的parent 和name 创建一个新的控件。您可以使用此函数来创建由availableWidgets() 函数返回的任何控件。
QUiLoader 类在创建控件时,内部也会使用此函数。因此,您可以继承QUiLoader 类并重写此函数,以干预用户界面或控件的构造过程。但在您的实现中,请确保先调用QUiLoader 中定义的版本。
另请参阅 availableWidgets() 和load()。
QString QUiLoader::errorString() const
返回load() 中发生的最后一个错误的通俗易懂描述。
另请参阅 load()。
bool QUiLoader::isLanguageChangeEnabled() const
如果启用了语言变更时的动态重新翻译,则返回true ;否则返回false 。
默认值为false 。
另请参阅 setLanguageChangeEnabled()。
QWidget *QUiLoader::load(QIODevice *device, QWidget *parentWidget = nullptr)
根据给定的device 实例化一个表单。若成功,则返回一个带有给定parentWidget 的新QWidget 对象;否则返回nullptr 。
警告:请仅 从可信来源(如Qt 资源系统)加载表单。从不可信来源加载.ui 文件可能会导致应用程序面临安全威胁,例如拒绝服务攻击、用户界面欺骗或加载意外的插件。
另请参阅 createWidget() 和errorString()。
QStringList QUiLoader::pluginPaths() const
返回一个列表,其中列出了加载器在查找自定义控件插件时将搜索的路径。
另请参阅 addPluginPath() 和clearPluginPaths()。
void QUiLoader::setLanguageChangeEnabled(bool enabled)
如果enabled 为真,则由该加载器加载的用户界面在收到语言更改事件时会自动重新翻译。否则,用户界面将不会被重新翻译。
另请参阅 isLanguageChangeEnabled()。
void QUiLoader::setWorkingDirectory(const QDir &dir)
将加载器的作业目录设置为dir 。加载器将在此目录的相对路径下查找其他资源,例如图标和资源文件。
警告:请仅 设置您信任的目录。允许不受信任的用户在工作目录中创建或添加内容可能会导致安全漏洞。
另请参阅 workingDirectory()。
QDir QUiLoader::workingDirectory() const
返回加载器的当前工作目录。
另请参阅 setWorkingDirectory()。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.