0

QWizardPage想定以上のことをするために曲げようとしていると思われるため、問題が発生していますが、これを行う方法があるかもしれません.

そのため、私は 内に多数のページを持っており、QWizardある特定のページで、いくつかのハードウェアに対して一連のテストを実行し、結果をデータベースに保存します。必要に応じてキャンセルできるようにしたい。ただし、現時点ではキャンセル ボタンは QWizard の一部であるため、その処理方法がわかりません。

reject()機能をオーバーライドして現在のページを特定し、それが興味のあるページである場合は何かを実行できることを認識してQWizardいますが、必要がない限り、この方法でページを結び付けたくありません。

rejected()次のように信号をウィザードに接続しようとしました:

connect(this, SIGNAL(rejected()), ui->runTestPage, SLOT(on_rejected()));

しかし、これはとにかくページを即座に閉じてから、ユーザーに何かを表示してキャンセルしていることを伝えます。

テストの実行中にキャンセルを許可するボタンをウィザード ページに追加できますが、ページにはまだメインのキャンセル ボタンがあります。実際、テストが完了した後でもキャンセルが表示されるので、それを削除または無効にすることが適切に思えます。

それで、これは私ができることですか、それともウィザードの使用全体を再検討する必要がありますか?

4

3 に答える 3

5

1 つの方法は、ウィザードのreject()スロットをcancelボタンのclicked()信号から切断してから、次のようにユーザーに本当に確信があるかどうかを尋ねる場所から独自のスロットを接続することです。

ウィザードのコンストラクターで:

// install a slot handling the cancel button, but disconnect the default slot that would close the wizard first
disconnect( button( QWizard::CancelButton ), SIGNAL( clicked() ), this, SLOT( reject() ) );
connect( button( QWizard::CancelButton ), SIGNAL( clicked() ), this, SLOT( cancelWizard() ) );

次に、独自のスロット処理キャンセルを実装します。

void SetupWizard::cancelWizard() {
    if( QMessageBox::question( this, trUtf8( "Quit Setup" ), trUtf8( "Setup is not complete yet. Are you sure you want to quit setup?" ), QMessageBox::Yes, QMessageBox::No ) == QMessageBox::Yes ) {
        // allow cancel
        reject();
    }
}
于 2012-09-17T12:39:46.953 に答える
2

はい、実行可能です。まず、必ずしもオーバーライドする必要はありません。キャンセル ボタンを削除するrejected()ルートをたどり、代わりに自分のスロットを指す独自の (またはどちらか) を挿入し、そこから「今すぐキャンセル」メッセージ ボックスを実行して、次に、スロットをトリガーします。QWizardQPushButtonrejected()

これにより、デフォルトのシグナル/スロットを操作することによる多くの頭痛の種が解消され、'Cancel' を 'Close' に置き換えることができます。これは、ウィザードのコンテキストでより意味のあるものになる可能性があります (ウィザード、機能などによって異なります)。 .

于 2012-06-22T15:33:25.010 に答える