我怀疑我正在尝试让QWizardPage
做比它应该做的更多的事情,这就是我遇到问题的原因,但也许有一种方法可以做到这一点。
因此,我在QWizard
中有多个页面,在一个特定的页面上,我对一些硬件运行了一系列测试,然后将结果存储在数据库中。如果有必要,我希望能够取消。但是,现在Cancel按钮是QWizard的一部分,所以我不确定如何处理它。
我意识到我可以重写QWizard
的reject()
函数,然后确定当前页面,如果它是我感兴趣的页面,则执行一些操作,但除非迫不得已,否则我不愿以这种方式将页面绑定在一起。
我确实尝试过将rejected()
信号连接到向导,如下所示:
connect(this, SIGNAL(rejected()), ui->runTestPage, SLOT(on_rejected()));
但这会立即关闭页面,然后我才能向用户显示任何内容,告诉用户我要取消。
我可以向向导页面添加一个按钮,当测试运行时将显示该按钮,以允许取消,但该页面仍然有主取消按钮。事实上,即使在测试完成后,Cancel仍然显示,因此能够删除或禁用它似乎是合适的。
那么,这是我可以做的事情,还是我需要重新使用向导的整个过程?
发布于 2012-06-22 15:33:25
是的,这是可行的。首先,你不一定需要覆盖rejected()
,我会沿着取消QWizard
cancel按钮的路线走下去,而是插入你自己的QPushButton
(或其他任何东西),指向你自己的插槽,从那里做你的“立即取消”消息框,然后触发rejected()
插槽。
这将为你省去很多处理默认信号/插槽的麻烦,并允许你将“Cancel”替换为“Close”,这在向导的上下文中可能更有意义(取决于向导、功能等)。
发布于 2012-09-17 12:39:47
一种方法是断开向导的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();
}
}
发布于 2019-12-27 10:32:58
您可以在向导类中重写reject
方法,并在reject
方法中调用QWizard::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();
}
}
https://stackoverflow.com/questions/11155494
复制相似问题