Sur cette page

Constructeur de calculatrice

Création d'une interface utilisateur à partir d'un formulaire Qt Widgets Designer au moment de l'exécution.

Capture d'écran d'une application de calculatrice qui additionne deux nombres et affiche la somme.

Nous utilisons le formulaire créé dans l'exemple du formulaire de calculatrice pour montrer que la même interface utilisateur peut être générée lors de l'exécution de l'application ou définie lors de la construction de l'application.

Préparation

L'exemple du formulaire de calcul définit une interface utilisateur que nous pouvons utiliser sans modification. Dans cet exemple, nous utilisons un fichier de ressources pour contenir le fichier calculatorform.ui créé dans l'exemple précédent, mais il pourrait être stocké sur le disque.

Pour générer un formulaire au moment de l'exécution, nous devons lier l'exemple à la bibliothèque de modules QtUiTools. Le fichier de projet que nous utilisons contient toutes les informations nécessaires à cet effet :

target_link_libraries(calculatorbuilder PRIVATE
    Qt6::UiTools
    Qt6::Widgets
)

Le fichier UI est chargé à partir d'une ressource :

qt_add_resources(calculatorbuilder "calculatorbuilder"
    PREFIX
        "/forms"
    FILES
        "calculatorform.ui"
)

Pour qmake:

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

Tous les autres fichiers nécessaires sont déclarés comme d'habitude.

Chargement du formulaire de calculatrice

Nous devrons utiliser la classe QUiLoader fournie par la bibliothèque libQtUiTools, et nous nous assurons donc d'abord d'inclure le fichier d'en-tête de la classe :

#include <QUiLoader>

Nous créons une fonction d'aide statique qui crée un widget de premier niveau et charge l'interface utilisateur que nous récupérons, via un objet QFile, dans les ressources de l'exemple :

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;

En incluant l'interface utilisateur dans les ressources de l'exemple, nous nous assurons qu'elle sera présente lors de l'exécution de l'exemple. La fonction QUiLoader::load() prend la description de l'interface utilisateur contenue dans le fichier et construit le widget de formulaire en tant que widget enfant de l'objet CalculatorForm.

Trois widgets nous intéressent dans l'interface utilisateur générée : deux boîtes de dialogue et une étiquette. Par commodité, nous récupérons des pointeurs vers ces widgets à partir du widget construit par FormBuilder, et nous les enregistrons pour une utilisation ultérieure. La fonction modèle findChild() nous permet d'interroger les widgets afin de trouver les widgets enfants nommés.

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

Le slot qui modifie le widget de sortie fourni par le formulaire est défini de la même manière que dans l'exemple du formulaire de calcul, sauf que nous utilisons un lambda, capturant les widgets trouvés :

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

Le widget du formulaire est ajouté à une disposition et le titre de la fenêtre est défini :

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

L'avantage de cette approche est que nous pouvons remplacer le formulaire lors de l'exécution de l'application, mais que nous pouvons toujours manipuler les widgets qu'il contient, à condition de leur attribuer des noms appropriés.

Cependant, le chargement d'un formulaire au moment de l'exécution entraîne un coût d'exécution par rapport à sa conversion en code C++ à l'aide de l'outil User Interface Compiler (uic ).

Exemple de projet @ code.qt.io

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