我怀疑我试图弯曲一个QWizardPage
来做更多的事情,这就是我遇到问题的原因,但也许有办法做到这一点。
因此,我在QWizard
内有多个页面,在某个特定页面上,我针对某些硬件运行一系列测试,然后将结果存储在数据库中。我希望能够在必要时取消。但是目前取消按钮是QWizard的一部分,所以我不知道如何处理它。
我知道我可以覆盖reject()
的{{1}}功能然后确定当前页面,如果它是我感兴趣的页面然后做一些事情,但我宁愿不把页面绑在一起除非我必须这样做。
我确实尝试将QWizard
信号连接到向导,如下所示:
rejected()
但是,在我向用户显示任何内容之前,我会立即关闭页面,说我正在取消。
我可以在向导页面中添加一个按钮,该按钮将在测试运行时显示以允许取消,但页面仍然具有主取消按钮。实际上,即使在测试完成后,仍然会显示取消,因此可以删除或禁用看似合适的内容。
这是我可以做或做的事情,我需要重新审视向导的整个使用吗?
答案 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();
}
}