電卓ビルダー
実行時に 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" )
qmake
UI ファイルはリソースからロードされます:
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++コードに変換するのに比べて、実行時のコストがかかります。
©2024 The Qt Company Ltd. 本書に含まれるドキュメントの著作権は、それぞれの所有者に帰属します。 ここで提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。