计算器构建器

在运行时从Qt Designer表单生成用户界面。

我们使用在计算器表单示例中创建的表单来展示,当应用程序执行时可以根据定义生成相同用户界面。

准备工作

计算器表单示例定义了一个用户界面,我们可以直接使用而无需修改。在这个示例中,我们使用一个资源文件来包含在前面示例中创建的calculatorform.ui文件,但它也可以存储在磁盘上。

为了在运行时生成表单,我们需要将示例链接到QtUiTools模块库。我们使用的项目文件包含了完成此操作所需的所有必要信息

target_link_libraries(calculatorbuilder PUBLIC
    Qt::Core
    Qt::Gui
    Qt::UiTools
    Qt::Widgets
)

UI文件从资源中加载

set(calculatorbuilder_resource_files
    "calculatorform.ui"
)

对于qmake

RESOURCES   = calculatorbuilder.qrc
SOURCES     = main.cpp
QT += widgets uitools

所有其他必要文件按常规声明。

加载计算器表单

我们需要使用由libQtUiTools库提供的QUiLoader类,所以我们首先确保我们包含了模块的头文件

#include <QtUiTools>

我们创建一个静态辅助函数,该函数创建顶层小部件,并通过QFile对象,从示例的资源中加载我们获取的用户界面

static QWidget *loadCalculatorForm(QWidget *parent = nullptr)
{
    QUiLoader loader;

    QFile file(u":/forms/calculatorform.ui"_s);
    if (!file.open(QFile::ReadOnly))
        return nullptr;
    QWidget *formWidget = loader.load(&file, parent);
    file.close();
    if (formWidget == nullptr)
        return nullptr;

通过在示例的资源中包含用户界面,我们确保示例运行时它将存在。loader.load()函数接收包含在文件中的用户界面描述,并构建作为CalculatorForm子小部件的表单小部件。

我们感兴趣的是在生成用户界面中的三个小部件:两个数值框和一个标签。为了方便起见,我们从由FormBuilder构建的小部件中检索这些小部件的指针,并为了将来使用而记录它们。findChild()模板函数允许我们查询小部件,以找到具有特定名称的子小部件。

    auto *inputSpinBox1 = formWidget->findChild<QSpinBox*>(u"inputSpinBox1"_s);
    auto *inputSpinBox2 = formWidget->findChild<QSpinBox*>(u"inputSpinBox2"_s);
    auto *outputWidget = formWidget->findChild<QLabel*>(u"outputWidget"_s);

修改表单提供的输出小部件的槽定义的方式与计算器表单示例中的方式相似,只是我们使用了一个lambda,它捕获找到的小部件

    auto updateResult = [inputSpinBox1, inputSpinBox2, outputWidget]()
    {
        const int sum = inputSpinBox1->value() + inputSpinBox2->value();
        outputWidget->setText(QString::number(sum));
    };
    QObject::connect(inputSpinBox1, &QSpinBox::valueChanged, formWidget, updateResult);
    QObject::connect(inputSpinBox2, &QSpinBox::valueChanged, formWidget, updateResult);

将表单小部件添加到布局中,并设置窗口标题

auto *layout = new QVBoxLayout(&w);
layout->addWidget(formWidget);
w.setWindowTitle(QCoreApplication::translate("CalculatorForm",
                                             "Calculator Builder"));

这种方法的优势在于,我们可以在运行应用程序时替换表单,但我们仍然可以操控包含在小部件中,只要给予适当的名称。

然而,与使用用户界面编译器(uic)工具将其转换为C++代码相比,在运行时加载表单会产生运行时成本。

示例项目 @ code.qt.io

© 2024 Qt公司有限公司。此处包含的文档贡献归各自所有者所有。本提供的文档受免费软件基金会发布的GNU自由文档许可证版本1.3的条款所许可。Qt及其相关标志是芬兰以及/或全球其他国家的Qt公司有限公司的商标。所有其他商标均为各自所有者的财产。