0

我怀疑我试图弯曲 aQWizardPage做的事情超出了预期,这就是我遇到问题的原因,但也许有办法做到这一点。

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

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

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

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

但这会立即关闭页面,然后我才能向用户显示任何内容以说我正在取消。

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

那么这是我可以做的事情还是我需要重新审视向导的整个使用?

4

3 回答 3

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

Then implement your own slot handling cancellation:

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(),我会沿着摆脱QWizard取消按钮的路线走,而是插入你自己的QPushButton(或任何一个)指向你自己的插槽,从那里做你的“现在取消”消息框和然后触发rejected()插槽。

它将为您省去很多对默认信号/插槽进行按摩的麻烦,并允许您将“取消”替换为“关闭”,这在向导的上下文中可能更有意义(取决于向导、功能等) .

于 2012-06-22T15:33:25.010 回答
1

You could override the reject method in your wizard class and call QWizard::reject in your reject method.

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();
    }
}
于 2019-12-27T10:32:58.137 回答