電卓ビルダー

実行時に Qt Widgets Designer フォームからユーザーインターフェースを作成する。

電卓フォームの例で作成したフォームを使用して、アプリケーションの実行時に同じユーザーインターフェースを生成したり、アプリケーションのビルド時に定義できることを示します。

準備

電卓フォームの例では、そのまま使えるユーザーインターフェイスを定義しています。この例では、前の例で作成したcalculatorform.ui ファイルを含むリソースファイルを使用していますが、代わりにディスクに保存することもできます。

実行時にフォームを生成するには、QtUiTools モジュール・ライブラリに対してサンプルをリンクする必要があります。使用するプロジェクトファイルには、そのために必要な情報がすべて含まれています:

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

UIファイルはリソースからロードされます:

set(calculatorbuilder_resource_files
    "calculatorform.ui"
)

qmakeUI ファイルはリソースからロードされます:

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

UIファイルはリソースからロードされます。

電卓フォームのロード

libQtUiTools ライブラリによって提供されているQUiLoader クラスを使う必要があるので、まず、このモジュールのヘッダーファイルをインクルードするようにします:

#include <QtUiTools>

トップレベルのウィジェットを作成する静的ヘルパー関数を作成し、QFile オブジェクトを経由してサンプルのリソースから取得したユーザーインターフェイスをロードします:

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;

ユーザーインターフェイスをサンプルのリソースに含めることで、サンプルの実行時に確実に存在するようにします。loader.load() 関数は、ファイルに含まれるユーザー・インターフェースの記述を受け取り、フォーム・ウィジェットをCalculatorForm の子ウィジェットとして構築します。

生成されたユーザー・インタフェースでは、2つのスピン・ボックスとラベルの3つのウィジェットに関心があります。便宜上、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);

フォームが提供する出力ウィジェットを修正するスロットは、見つかったウィジェットをキャプチャするラムダを使うことを除いて、電卓フォームの例と同様の方法で定義されます:

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

この方法の利点は、アプリケーションの実行時にフォームを置き換えることができることですが、適切な名前が与えられている限り、フォームに含まれるウィジェットを操作することができます。

しかし、実行時にフォームを読み込むと、ユーザー・インターフェイス・コンパイラ(uic)ツールを使ってC++コードに変換するのに比べて、実行時のコストがかかります。

プロジェクト例 @ code.qt.io

©2024 The Qt Company Ltd. 本書に含まれるドキュメントの著作権は、それぞれの所有者に帰属します。 ここで提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。