プログラミング初心者でも安心!Qt WidgetsのQWizard::WizardButtonチュートリアル


QWizard::WizardButton は、Qt Widgets ライブラリにおける QWizard ウィジェットで使用されるボタンの種類を定義する列挙型です。この列挙型は、標準のボタン (BackButton, NextButton, FinishButton, CancelButton) と、ユーザー定義のボタン (CustomButton1, CustomButton2, CustomButton3) を区別するために使用されます。

定数

定数説明対応するボタン
BackButton前のページに戻るボタンBack
NextButton次のページへ進むボタンNext
FinishButtonウィザードを完了するボタンFinish
CancelButtonウィザードをキャンセルするボタンCancel
HelpButtonヘルプを表示するボタンHelp
CustomButton1ユーザー定義ボタン 1ユーザー定義 1
CustomButton2ユーザー定義ボタン 2ユーザー定義 2
CustomButton3ユーザー定義ボタン 3ユーザー定義 3
Stretchボタン間のスペースを伸縮させるためのスペース伸縮
// 標準の "Finish" ボタンを取得する
QAbstractButton *finishButton = wizard->button(QWizard::FinishButton);

// ユーザー定義ボタン 2 のテキストを設定する
wizard->setButtonText(QWizard::CustomButton2, "My Custom Button");

// ユーザー定義ボタン 1 がクリックされたときにシグナルを接続する
connect(wizard, &QWizard::customButtonClicked, this, &MyClass::handleCustomButton1Clicked);
  • ユーザー定義ボタンがクリックされたときにシグナルが発行されます。このシグナルを接続して、ボタンがクリックされたときに実行するアクションを処理できます。
  • ユーザー定義ボタンを追加するには、addCustomButton() メソッドを使用します。
  • 標準ボタンのテキストは、setButtonText() メソッドを使用して変更できます。
  • Qt の公式ドキュメントは、Qt の機能と使用方法に関する詳細な情報源です。


#include <QApplication>
#include <QWizard>

class MyWizard : public QWizard {
public:
    MyWizard(QWidget *parent = nullptr);

protected:
    virtual int nextId() const override;
};

MyWizard::MyWizard(QWidget *parent) : QWizard(parent) {
    // ウィザードの設定
    setWindowTitle("My Wizard");
    addPage(new MyPage1());
    addPage(new MyPage2());

    // ユーザー定義ボタンを追加
    setButton(QWizard::CustomButton1, "Custom Button 1");
    setButton(QWizard::CustomButton2, "Custom Button 2");

    // ユーザー定義ボタンがクリックされたときにシグナルを接続
    connect(this, &QWizard::customButtonClicked, this, &MyWizard::handleCustomButtonClicked);
}

int MyWizard::nextId() const {
    // ユーザー定義ボタン 1 がクリックされた場合は、ページ 2 に進む
    if (button(QWizard::CustomButton1) == clickedButton()) {
        return MyPage2::pageId;
    }

    // それ以外の場合は、標準のロジックを使用
    return QWizard::nextId();
}

void MyWizard::handleCustomButtonClicked(int id) {
    // ボタン ID に基づいてメッセージを表示
    switch (id) {
        case QWizard::CustomButton1:
            QMessageBox::information(this, "Custom Button 1", "Custom Button 1 was clicked!");
            break;
        case QWizard::CustomButton2:
            QMessageBox::information(this, "Custom Button 2", "Custom Button 2 was clicked!");
            break;
    }
}

class MyPage1 : public QWidget {
public:
    MyPage1(QWidget *parent = nullptr);
};

MyPage1::MyPage1(QWidget *parent) : QWidget(parent) {
    // ページ 1 のレイアウト
    QLabel *label = new QLabel("This is page 1.", this);
    label->setAlignment(Qt::AlignCenter);
}

class MyPage2 : public QWidget {
public:
    MyPage2(QWidget *parent = nullptr);
};

MyPage2::MyPage2(QWidget *parent) : QWidget(parent) {
    // ページ 2 のレイアウト
    QLabel *label = new QLabel("This is page 2.", this);
    label->setAlignment(Qt::AlignCenter);
}

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // ウィザードを作成して表示
    MyWizard wizard;
    wizard.show();

    return app.exec();
}

このコードを実行すると、次のようになります。

  1. ウィザードが表示されます。
  2. "Page 1" というタイトルのページが表示されます。このページには、"This is page 1." というラベルが表示されます。
  3. "Next", "Custom Button 1", "Custom Button 2", "Cancel" というボタンが表示されます。
  4. "Custom Button 1" をクリックすると、"Custom Button 1 was clicked!" というメッセージが表示され、"Page 2" というタイトルのページが表示されます。このページには、"This is page 2." というラベルが表示されます。
  5. "Next" をクリックすると、ウィザードが完了します。
  6. "Cancel" をクリックすると、ウィザードがキャンセルされます。


しかし、QWizard::WizardButton (enum) を使用する代わりに、以下の方法を使用することもできます。

QAbstractButton オブジェクトを使用する

QWizard ウィジェットは、QAbstractButton オブジェクトを使用して標準ボタンとユーザー定義ボタンを追加することができます。この方法は、QWizard::WizardButton (enum) を使用するよりも柔軟性が高く、より多くの制御を提供します。

// 標準の "Finish" ボタンを取得する
QAbstractButton *finishButton = new QPushButton("Finish", this);
wizard->layout()->addWidget(finishButton);

// ユーザー定義ボタン 2 を追加
QAbstractButton *customButton2 = new QPushButton("My Custom Button", this);
wizard->layout()->addWidget(customButton2);

// ボタンがクリックされたときにシグナルを接続
connect(finishButton, &QAbstractButton::clicked, this, &MyClass::handleFinishButtonClicked);
connect(customButton2, &QAbstractButton::clicked, this, &MyClass::handleCustomButton2Clicked);

カスタムボタンバーを使用する

QWizard ウィジェットは、カスタムボタンバーを使用して標準ボタンとユーザー定義ボタンを追加することができます。この方法は、ボタンのレイアウトをより細かく制御したい場合に便利です。

// カスタムボタンバーを作成
QAbstractButton *backButton = new QPushButton("Back", this);
QAbstractButton *nextButton = new QPushButton("Next", this);
QAbstractButton *finishButton = new QPushButton("Finish", this);
QAbstractButton *cancelButton = new QPushButton("Cancel", this);

QHBoxLayout *buttonLayout = new QHBoxLayout();
buttonLayout->addWidget(backButton);
buttonLayout->addWidget(nextButton);
buttonLayout->addWidget(finishButton);
buttonLayout->addWidget(cancelButton);

QWizardButtonBar *buttonBar = new QWizardButtonBar(buttonLayout, this);
wizard->setButtonBar(buttonBar);

// ボタンがクリックされたときにシグナルを接続
connect(backButton, &QAbstractButton::clicked, wizard, &QWizard::back);
connect(nextButton, &QAbstractButton::clicked, wizard, &QWizard::next);
connect(finishButton, &QAbstractButton::clicked, wizard, &QWizard::accept);
connect(cancelButton, &QAbstractButton::clicked, wizard, &QWizard::reject);

QPushButton オブジェクトを直接追加する

QWizard ウィジェットには、QPushButton オブジェクトを直接追加することもできます。この方法は、最も単純な方法ですが、標準ボタンやユーザー定義ボタンのすべての機能が利用できない場合があります。

QPushButton *finishButton = new QPushButton("Finish", this);
wizard->layout()->addWidget(finishButton);

// ボタンがクリックされたときにシグナルを接続
connect(finishButton, &QAbstractButton::clicked, this, &MyClass::handleFinishButtonClicked);
  • 標準ボタンやユーザー定義ボタンのすべての機能が不要な場合は、QPushButton オブジェクトを直接追加する方が簡単です。
  • ボタンのレイアウトをより細かく制御したい場合は、カスタムボタンバーを使用する方が適しています。
  • 標準ボタンとユーザー定義ボタンのテキストを設定したり、ボタンがクリックされたときにシグナルを接続したりする必要がある場合は、QWizard::WizardButton (enum) を使用する方が簡単です。
  • QPushButton オブジェクトを直接追加する場合は、ボタンのレイアウトを自分で管理する必要があります。
  • カスタムボタンバーを使用する場合は、QWizard::setButtonBar() メソッドを使用してボタンバーを設定する必要があります。