Calculator Builder

Erstellen einer Benutzeroberfläche aus einem Qt Widgets Designer-Formular zur Laufzeit.

Anhand des im Beispiel Calculator Form erstellten Formulars wird gezeigt, dass die gleiche Benutzeroberfläche bei der Ausführung der Anwendung generiert oder bei der Erstellung der Anwendung definiert werden kann.

Vorbereitung

Das Calculator Form-Beispiel definiert eine Benutzeroberfläche, die wir ohne Änderungen verwenden können. In diesem Beispiel verwenden wir eine Ressourcendatei, die die im vorigen Beispiel erstellte Datei calculatorform.ui enthält, aber sie könnte stattdessen auch auf der Festplatte gespeichert werden.

Um ein Formular zur Laufzeit zu generieren, müssen wir das Beispiel mit der Modulbibliothek QtUiTools verknüpfen. Die von uns verwendete Projektdatei enthält alle hierfür erforderlichen Informationen:

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

Die UI-Datei wird aus einer Ressource geladen:

set(calculatorbuilder_resource_files
    "calculatorform.ui"
)

Für qmake:

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

Alle anderen notwendigen Dateien werden wie üblich deklariert.

Laden des Taschenrechnerformulars

Wir müssen die Klasse QUiLoader verwenden, die von der Bibliothek libQtUiTools bereitgestellt wird, also stellen wir zunächst sicher, dass wir die Header-Datei für das Modul einschließen:

#include <QtUiTools>

Wir erstellen eine statische Hilfsfunktion, die ein Widget der obersten Ebene erstellt und die Benutzeroberfläche lädt, die wir über ein QFile Objekt aus den Ressourcen des Beispiels abrufen:

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;

Indem wir die Benutzeroberfläche in die Ressourcen des Beispiels aufnehmen, stellen wir sicher, dass sie vorhanden ist, wenn das Beispiel ausgeführt wird. Die Funktion loader.load() nimmt die in der Datei enthaltene Beschreibung der Benutzeroberfläche und konstruiert das Formular-Widget als untergeordnetes Widget von CalculatorForm.

Wir interessieren uns für drei Widgets in der generierten Benutzeroberfläche: zwei Spinboxen und ein Etikett. Der Einfachheit halber rufen wir Zeiger auf diese Widgets aus dem Widget ab, das von FormBuilder konstruiert wurde, und speichern sie zur späteren Verwendung. Mit der Vorlagenfunktion findChild() können wir Widgets abfragen, um benannte untergeordnete Widgets zu finden.

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

Der Slot, der das vom Formular bereitgestellte Ausgabe-Widget ändert, wird auf ähnliche Weise definiert wie im Beispiel des Taschenrechner-Formulars, mit dem Unterschied, dass wir ein Lambda verwenden, das die gefundenen Widgets festhält:

    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);

Das Formular-Widget wird zu einem Layout hinzugefügt, und der Fenstertitel wird gesetzt:

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

Der Vorteil dieses Ansatzes ist, dass wir das Formular ersetzen können, wenn die Anwendung ausgeführt wird, aber wir können immer noch die Widgets, die es enthält, manipulieren, solange sie mit geeigneten Namen versehen werden.

Das Laden eines Formulars zur Laufzeit verursacht jedoch Laufzeitkosten im Vergleich zur Konvertierung in C++-Code mit dem Tool User Interface Compiler (uic).

Beispielprojekt @ code.qt.io

© 2025 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.