Qt Widgetsプログラミング:QWizard::next()のしくみを理解して、ワンランク上のウィザード開発へ


QWizard::next() は、Qt Widgets ライブラリで提供されるクラス QWizard のメソッドです。このメソッドは、ウィザードの進行を次のページに進めるために使用されます。

使用方法

QWizard::next() メソッドは、単に呼び出すだけで使用できます。このメソッドは、現在のページの nextId() メソッドによって返される ID に基づいて、ウィザードの次のページに切り替えます。

内部処理

QWizard::next() メソッドは、以下の処理を実行します。

  1. 現在のページの validateCurrentPage() メソッドを呼び出し、ページの入力内容が有効かどうかを確認します。
  2. 入力内容が有効な場合、現在のページの nextId() メソッドを呼び出し、次のページの ID を取得します。
  3. 取得した ID に基づいて、ウィザードの次のページに切り替えます。
  4. 次のページの initializePage() メソッドを呼び出し、ページを初期化します。

QWizard wizard;
wizard.addPage(new WelcomePage);
wizard.addPage(new LicensePage);
wizard.addPage(new InstallationPage);

connect(wizard, &QWizard::next, &wizard, &QWizard::nextId);

wizard.exec();

この例では、WelcomePageLicensePageInstallationPage の 3 つのページを持つウィザードを作成します。connect() 関数を使用して、next シグナルを nextId() メソッドに接続します。これにより、next ボタンがクリックされたときに、nextId() メソッドが呼び出され、次のページに切り替えられます。

  • QWizard::next() メソッドは、ウィザードの進行を次のページに進めるための基本的な方法です。より複雑なロジックを実装したい場合は、nextId() メソッドや validateCurrentPage() メソッドを再実装する必要があります。


#include <QApplication>
#include <QWizard>

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

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

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

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

    QWizard wizard;
    wizard.addPage(new WelcomePage);
    wizard.addPage(new LicensePage);
    wizard.addPage(new InstallationPage);

    connect(wizard, &QWizard::next, &wizard, &QWizard::nextId);

    wizard.exec();

    return app.exec();
}

WelcomePage::WelcomePage(QWidget *parent) : QWizardPage(parent) {
    setTitle("Welcome");

    QLabel *label = new QLabel("Welcome to the wizard!", this);
    label->setAlignment(Qt::AlignCenter);

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(label);

    setLayout(layout);
}

LicensePage::LicensePage(QWidget *parent) : QWizardPage(parent) {
    setTitle("License");

    QTextEdit *textEdit = new QTextEdit(this);
    textEdit->setReadOnly(true);
    textEdit->setText("This is the license agreement.\n\nPlease read it carefully before proceeding.");

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(textEdit);

    setLayout(layout);
}

InstallationPage::InstallationPage(QWidget *parent) : QWizardPage(parent) {
    setTitle("Installation");

    QLabel *label = new QLabel("Installation is in progress...", this);
    label->setAlignment(Qt::AlignCenter);

    QProgressBar *progressBar = new QProgressBar(this);
    progressBar->setValue(50);

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(label);
    layout->addWidget(progressBar);

    setLayout(layout);
}

このコードでは、WelcomePageLicensePageInstallationPage の 3 つのページを持つウィザードを作成します。それぞれのページには、簡単なタイトルとラベルが表示されます。



以下に、QWizard::next() の代替方法として考えられるいくつかの方法をご紹介します。

setCurrentId() メソッドを使用する

setCurrentId() メソッドを使用して、ウィザードの現在のページを直接設定することができます。この方法は、QWizard::next() メソッドよりも柔軟な制御を提供しますが、ロジックが複雑になる可能性があります。

wizard.setCurrentId(nextPageId);

カスタムシグナルとスロットを使用する

カスタムシグナルとスロットを使用して、ウィザードの進行を制御することができます。この方法は、より複雑なロジックを実装する場合に役立ちます。

connect(myWidget, &MyWidget::nextPage, &wizard, &QWizard::setCurrentId);

done() シグナルを使用する

done() シグナルを使用して、ウィザードが完了したことを検出することができます。このシグナルを接続して、ウィザードの終了後にカスタム処理を実行することができます。

connect(wizard, &QWizard::done, this, &MyClass::handleWizardFinished);

サブウィジェットを使用する

サブウィジェットを使用して、ウィザードの各ページを個別に実装することができます。この方法は、より複雑なページレイアウトやユーザーインタラクションが必要な場合に役立ちます。

WelcomePage *welcomePage = new WelcomePage;
wizard.addPage(welcomePage);

connect(welcomePage, &WelcomePage::nextPage, &wizard, &QWizard::next);
  • より複雑なロジックが必要な場合は、setCurrentId() メソッド、カスタムシグナルとスロット、またはサブウィジェットを使用することができます。
  • シンプルなウィザードの場合は、QWizard::next() メソッドを使用するのが最善です。