En esta página

Constructor de calculadoras

Creación de una interfaz de usuario a partir de un formulario de Qt Widgets Designer en tiempo de ejecución.

Captura de pantalla de una aplicación de calculadora que suma dos números y obtiene la suma.

Usamos el formulario creado en el ejemplo Calculator Form para mostrar que la misma interfaz de usuario puede ser generada cuando la aplicación es ejecutada o definida cuando la aplicación es construida.

Preparación

El ejemplo Calculator Form define una interfaz de usuario que podemos utilizar sin modificaciones. En este ejemplo, utilizamos un archivo de recursos para contener el archivo calculatorform.ui creado en el ejemplo anterior, pero podría almacenarse en disco en su lugar.

Para generar un formulario en tiempo de ejecución, necesitamos enlazar el ejemplo con la biblioteca de módulos QtUiTools. El archivo de proyecto que utilizamos contiene toda la información necesaria para hacerlo:

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

El archivo UI se carga desde un recurso:

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

Para qmake:

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

Todos los demás archivos necesarios se declaran como de costumbre.

Cargando el formulario de la calculadora

Necesitaremos utilizar la clase QUiLoader que proporciona la librería libQtUiTools, por lo que primero nos aseguramos de incluir el fichero de cabecera de la clase:

#include <QUiLoader>

Creamos una función helper estática que crea un widget de nivel superior y carga la interfaz de usuario que recuperamos, mediante un objeto QFile, de los recursos del ejemplo:

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;

Al incluir la interfaz de usuario en los recursos del ejemplo, nos aseguramos de que estará presente cuando se ejecute el ejemplo. La función QUiLoader::load() toma la descripción de la interfaz de usuario contenida en el archivo y construye el widget del formulario como un widget hijo de CalculatorForm.

Estamos interesados en tres widgets de la interfaz de usuario generada: dos cajas giratorias y una etiqueta. Por conveniencia, recuperamos punteros a estos widgets desde el widget que fue construido por el FormBuilder, y los registramos para su uso posterior. La función de plantilla findChild() nos permite consultar los widgets para encontrar widgets hijos con nombre.

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

La ranura que modifica el widget de salida proporcionado por el formulario se define de forma similar a la del ejemplo Formulario de calculadora, salvo que utilizamos un lambda, capturando los widgets encontrados:

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

El widget del formulario se añade a un layout, y se establece el título de la ventana:

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

La ventaja de este enfoque es que podemos reemplazar el formulario cuando se ejecuta la aplicación, pero podemos seguir manipulando los widgets que contiene siempre que se les den los nombres apropiados.

Sin embargo, cargar un formulario en tiempo de ejecución incurre en un coste de tiempo de ejecución en comparación con convertirlo a código C++ utilizando la herramienta User Interface Compiler (uic).

Proyecto de ejemplo @ 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.