我怀疑我正在努力使a QWizardPage做得比预期的要多,这就是为什么我遇到问题的原因,但是也许有一种方法可以做到。
因此,我在内有许多页面,QWizard并且在某个页面上,我针对某些硬件运行了一系列测试,然后将结果存储在数据库中。我希望能够在必要时取消。但是,目前“取消”按钮是QWizard的一部分,因此我不确定如何处理它。
我知道我可以覆盖其reject()功能,QWizard然后确定当前页面,如果它是我感兴趣的页面,则可以执行一些操作,但是除非有必要,否则我不希望以这种方式将页面捆绑在一起。
我确实尝试将rejected()信号连接到向导,如下所示:
connect(this, SIGNAL(rejected()), ui->runTestPage, SLOT(on_rejected()));
Run Code Online (Sandbox Code Playgroud)
但这无论如何都会立即关闭页面,然后我才能向用户显示任何内容以表示我要取消。
我可以在向导页面上添加一个按钮,该向导页面将在测试运行时显示以允许取消,但是该页面仍然具有主要的取消按钮。实际上,即使在测试完成后,“取消”仍然会显示,因此能够删除或禁用它似乎是适当的。
那么,这是我可以做的事情还是需要重新回顾向导的整个使用过程?
小智 5
一种方法是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() ) );
Run Code Online (Sandbox Code Playgroud)
然后实施您自己的插槽处理取消:
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();
}
}
Run Code Online (Sandbox Code Playgroud)