2012-06-22 28 views
0

我怀疑我试图弯曲一个QWizardPage做比应付更多的事情,这就是为什么我遇到问题,但也许有办法做到这一点。在向导页面上处理取消

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

我知道我可以在此改变的QWizardreject()功能,然后确定当前页面,如果是我很感兴趣,那么页面做一些事情,但我宁愿不togehter扳平页,这样,除非我必须。

我曾尝试到rejected()信号连接到这样的向导:

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

但这无论如何立即关闭网页之前,我可以显示任何内容返回给用户说我取消。

我可以在向导页面上添加一个按钮,当测试运行时会显示一个按钮以允许取消,但是页面仍然有主取消按钮。事实上,即使在测试完成后,取消仍然显示,以便能够删除或禁用,看起来合适。

那么,这是我可以做或我需要重新访问向导的整个使用?

回答

2

是的,它是可行的。首先,您不一定需要覆盖rejected(),我会沿着摆脱QWizard取消按钮的路线行进,而是将您自己的QPushButton(或其中任何一个)指向自己的位置,执行“取消立即”消息框从那里开始,然后触发rejected()插槽。

它将为您节省很多头疼的按摩默认信号/插槽,并允许您替换'取消'与'关闭',这可能在一个向导的上下文更有意义(取决于向导,功能等)等)。

+0

感谢您的。这听起来是个不错的选择,尽管越多我弯曲向导所做的事情越多,我认为我可以通过创建自己的向导和类似堆叠小部件的方式完成此操作:)但是,无论如何,这对我有用 – Firedragon

4

一种方法是从cancel按钮的clicked()信号断开向导的reject()插槽,然后从那里你问用户,如果他真的相信,像这样连自己的插槽:

在你的向导的构造函数:

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