在向导页面上处理取消

时间:2012-06-22 11:40:48

标签: qt

我怀疑我试图弯曲一个QWizardPage来做更多的事情,这就是我遇到问题的原因,但也许有办法做到这一点。

因此,我在QWizard内有多个页面,在某个特定页面上,我针对某些硬件运行一系列测试,然后将结果存储在数据库中。我希望能够在必要时取消。但是目前取消按钮是QWizard的一部分,所以我不知道如何处理它。

我知道我可以覆盖reject()的{​​{1}}功能然后确定当前页面,如果它是我感兴趣的页面然后做一些事情,但我宁愿不把页面绑在一起除非我必须这样做。

我确实尝试将QWizard信号连接到向导,如下所示:

rejected()

但是,在我向用户显示任何内容之前,我会立即关闭页面,说我正在取消。

我可以在向导页面中添加一个按钮,该按钮将在测试运行时显示以允许取消,但页面仍然具有主取消按钮。实际上,即使在测试完成后,仍然会显示取消,因此可以删除或禁用看似合适的内容。

这是我可以做或做的事情,我需要重新审视向导的整个使用吗?

3 个答案:

答案 0 :(得分: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() ) );

然后实现您自己的插槽处理取消:

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();
    }
}

答案 1 :(得分:2)

是的,这是可行的。首先,您不一定需要覆盖rejected(),我会走掉摆脱QWizard取消按钮的路线,而是插入您自己的QPushButton(或其中任何一个)指向你自己的插槽,从那里做“你现在取消”消息框,然后触发rejected()插槽。

通过按摩默认信号/插槽可以省去很多麻烦,并允许您将'取消'替换为'关闭',这可能在向导的上下文中更有意义(取决于向导,功能)等等。)

答案 2 :(得分:0)

您可以在向导类中覆盖reject方法,并在QWizard::reject方法中调用reject

void MyWizard::reject()
{
    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
        QWizard::reject();
    }
}