이 페이지에서

계산기 생성기

실행 시점에 ‘ Qt Widgets Designer ’ 양식을 사용하여 사용자 인터페이스 생성하기.

두 숫자를 더하고 그 합을 출력하는 계산기 애플리케이션의 스크린샷

'계산기 양식' 예제에서 만든 양식을 사용하여, 애플리케이션 실행 시 동일한 사용자 인터페이스를 생성할 수도 있고, 애플리케이션 빌드 시 정의할 수도 있음을 보여줍니다.

준비

'계산기 양식(Calculator Form )' 예제에서는 수정 없이 바로 사용할 수 있는 사용자 인터페이스가 정의되어 있습니다. 이 예제에서는 리소스 파일을 사용하여 이전 예제에서 생성된 ' calculatorform.ui ' 파일을 포함하지만, 대신 디스크에 저장할 수도 있습니다.

실행 시에 폼을 생성하려면 이 예제를 QtUiTools 모듈 라이브러리에 링크해야 합니다. 사용하는 프로젝트 파일에는 이를 수행하는 데 필요한 모든 정보가 포함되어 있습니다:

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

UI 파일은 리소스에서 불러옵니다:

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

qmake 의 경우:

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

다른 모든 필요한 파일은 평소와 같이 선언됩니다.

계산기 폼 불러오기

libQtUiTools 라이브러리에서 제공하는 QUiLoader 클래스를 사용해야 하므로, 먼저 해당 클래스의 헤더 파일을 포함하도록 합니다:

#include <QUiLoader>

최상위 위젯을 생성하고, 예제의 리소스에서 QFile 객체를 통해 가져온 사용자 인터페이스를 불러오는 정적 헬퍼 함수를 만듭니다:

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;

예제의 리소스에 사용자 인터페이스를 포함시킴으로써, 예제가 실행될 때 해당 인터페이스가 반드시 존재하도록 보장합니다. QUiLoader::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);

폼에서 제공하는 출력 위젯을 수정하는 슬롯은 ‘계산기 폼(Calculator Form )’ 예제와 유사한 방식으로 정의되지만, 발견된 위젯들을 캡처하는 람다를 사용한다는 점이 다릅니다:

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

이 접근 방식의 장점은 애플리케이션 실행 시 양식을 교체할 수 있으면서도, 적절한 이름이 지정된 한 양식에 포함된 위젯을 계속 조작할 수 있다는 점입니다.

그러나 런타임에 폼을 불러오는 것은 User Interface Compiler (uic) 도구를 사용하여 C++ 코드로 변환하는 것에 비해 런타임 오버헤드가 발생합니다.

예제 프로젝트 @ 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.