Rechner-Generator
Erstellen einer Benutzeroberfläche aus einem Formular des „ Qt Widgets -Designers“ zur Laufzeit.

Wir verwenden das im Beispiel „Calculator Form“ erstellte Formular, um zu zeigen, dass dieselbe Benutzeroberfläche sowohl bei der Ausführung der Anwendung generiert als auch beim Erstellen der Anwendung definiert werden kann.
Vorbereitung
Das Beispiel „Calculator Form“ definiert eine Benutzeroberfläche, die wir ohne Änderungen verwenden können. In diesem Beispiel nutzen wir eine Ressourcendatei, um die im vorherigen Beispiel erstellte „ calculatorform.ui “-Datei zu enthalten, sie könnte jedoch 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 dafür erforderlichen Informationen:
target_link_libraries(calculatorbuilder PRIVATE
Qt6::UiTools
Qt6::Widgets
)Die UI-Datei wird aus einer Ressource geladen:
qt_add_resources(calculatorbuilder "calculatorbuilder"
PREFIX
"/forms"
FILES
"calculatorform.ui"
)Für „ qmake “:
RESOURCES = calculatorbuilder.qrc
SOURCES = main.cpp
QT += widgets uitoolsAlle anderen erforderlichen Dateien werden wie gewohnt deklariert.
Laden des Rechner-Formulars
Da wir die Klasse ` QUiLoader ` aus der Bibliothek „ libQtUiTools “ benötigen, stellen wir zunächst sicher, dass wir die Header-Datei für diese Klasse einbinden:
#include <QUiLoader>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)
{
QFile file(u":/forms/calculatorform.ui"_s);
if (!file.open(QFile::ReadOnly))
return nullptr;
QWidget *formWidget = QUiLoader().load(&file, parent);
if (!formWidget)
return nullptr;Indem wir die Benutzeroberfläche in die Ressourcen des Beispiels aufnehmen, stellen wir sicher, dass sie bei der Ausführung des Beispiels vorhanden ist. Die Funktion ` QUiLoader::load()` übernimmt die in der Datei enthaltene Beschreibung der Benutzeroberfläche und erstellt das Formular-Widget als untergeordnetes Widget des ` CalculatorForm`.
Uns interessieren drei Widgets in der generierten Benutzeroberfläche: zwei Drehfelder und ein Label. Der Einfachheit halber rufen wir Zeiger auf diese Widgets aus dem von ` FormBuilder` erstellten Widget ab und speichern sie für die spätere Verwendung. Die Template-Funktion ` findChild() ` ermöglicht es uns, Widgets abzufragen, 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 modifiziert, wird ähnlich wie im Beispiel „Calculator Form“ definiert, mit dem Unterschied, dass wir ein Lambda verwenden, das die gefundenen Widgets erfasst:
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 einem Layout hinzugefügt, und der Fenstertitel wird festgelegt:
auto *layout = new QVBoxLayout(&w);
layout->addWidget(formWidget);
w.setWindowTitle(QCoreApplication::translate("CalculatorForm",
"Calculator Builder"));Der Vorteil dieses Ansatzes besteht darin, dass wir das Formular bei Ausführung der Anwendung ersetzen können, aber dennoch die darin enthaltenen Widgets bearbeiten können, solange sie entsprechend benannt sind.
Das Laden eines Formulars zur Laufzeit verursacht jedoch einen Leistungsaufwand im Vergleich zur Konvertierung in C++-Code mithilfe des Tools „User Interface Compiler “ (uic).
© 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.