電卓フォーム/複数継承

Qt Widgets Designer で作成したフォームをアプリケーションで使用する。

多重継承の例では、QWidget とユーザー・インターフェイス・クラス(Ui::CalculatorForm )の両方をサブクラス化することで、Qt Widgets Designerで作成したフォームをアプリケーションで使用する方法を示します。

calculatorform.ui ファイルをサブクラス化し、qmakeuic で処理するようにするには、calculatorform.ui.pro ファイルに含める必要があります:

QT += widgets

HEADERS = calculatorform.h
SOURCES = calculatorform.cpp main.cpp
FORMS = calculatorform.ui

プロジェクトがコンパイルされると、uic が対応するui_calculatorform.h を生成します。

電卓フォームの定義

CalculatorForm の定義には、先ほど生成されたui_calculatorform.h を含めます。

#include "ui_calculatorform.h"

前述したように、このクラスはQWidgetUi::CalculatorForm のサブクラスです。

class CalculatorForm : public QWidget, private Ui::CalculatorForm
{
    Q_OBJECT

public:
    explicit CalculatorForm(QWidget *parent = nullptr);

private slots:
    void on_inputSpinBox1_valueChanged(int value);
    void on_inputSpinBox2_valueChanged(int value);
};

uic が要求する自動接続命名規則に従って、2つのスロットが定義されている。これは、QMetaObject の自動接続機能によって、関係するすべての信号とスロットが自動的に接続されるようにするためです。

電卓フォームの実装

コンストラクタでは、setupUi() を呼び出してユーザー・インターフェース・ファイルをロードします。setupUi はUi::CalculatorForm のメソッドであることに注意してください。

CalculatorForm::CalculatorForm(QWidget *parent)
    : QWidget(parent)
{
    setupUi(this);
}

on_inputSpinBox1_valueChanged()on_inputSpinBox2_valueChanged() の2つのスロットがあります。これらのスロットは、両方のスピンボックスが発するvalueChanged() シグナルに応答します。片方のスピンボックスの値に変更があるたびに、その値を取り、もう片方のスピンボックスの値に追加します。

void CalculatorForm::on_inputSpinBox1_valueChanged(int value)
{
    outputWidget->setText(QString::number(value + inputSpinBox2->value()));
}

void CalculatorForm::on_inputSpinBox2_valueChanged(int value)
{
    outputWidget->setText(QString::number(value + inputSpinBox1->value()));
}

main() 関数

main() 関数はQApplicationCalculatorForm をインスタンス化します。calculator オブジェクトはshow() 関数を呼び出すことで表示されます。

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    CalculatorForm calculator;
    calculator.show();
    return app.exec();
}

アプリケーションにフォームを組み込むには、さまざまなアプローチがあります。マルチプル継承はその 1 つです。その他のアプローチについては、「アプリケーションでデザイナーUIファイルを使用する」を参照してください。

サンプルプロジェクト @ code.qt.io

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