我有一个由Qt Creator的表单向导生成的QWizard
子类。如文档中所述,我重新实现了nextId()
来验证输入并创建一个非线性向导。问题是nextId()
被调用两次:一次进入页面,一次退出。我需要在字段上进行最后一刻的简单检查,然后引导用户进入下一页,或者显示错误消息并将用户保留在当前页面中。
注意:我已经使用Qt Creator的Form Generator制作了向导。页面包含在ui文件中。因此,重新实现QWizardPage::nextId()
是不可行的。
更新:这是代码:
int WizardBackupDatabase::nextId() const
{
Page nextPage;
Page currentPageType = static_cast<Page>(currentId());
qDebug() << currentId(); // This prints twice
switch (currentPageType) {
case Page::Intro:
nextPage = Page::DataSource;
break;
case Page::DataSource:
if(checkSource()) {
nextPage = Page::Settings;
}
else {
nextPage = Page::DataSource;
}
break;
case Page::Settings:
if(checkSettings()) {
nextPage = Page::Verify;
}
else {
nextPage = Page::Settings;
}
break;
case Page::Verify:
nextPage = Page::Operation;
break;
case Page::Operation:
return -1;
default:
return -1;
}
return static_cast<int>(nextPage);
}
最佳答案
在调用nextId
时,您已经承诺要切换页面。在那时进行任何验证完全没有任何意义。
实际上,使nextId
实现执行任何验证或显示任何用户界面都是语义错误。可以根据实现的需要多次调用它,并且您的代码应对此进行应对。只需考虑一下此方法等效即可。这是一个查询方法,与容器上的size
方法不同。
为了验证输入,理想情况下,您应该重新实现isComplete
,或者声明必填字段,或者重新实现validateCurrentPage
。validateCurrentPage
由QWizard::next
调用。如果返回true,则调用nextId
以查询要切换到的页面,然后切换页面。 switchToPage
专用代码再次调用nextId
以验证下一页是否无效。这就是您遇到的重复通话的来源。
您的checkSettings
呼叫根本不属于nextId
。它们属于validateCurrentPage
。
通过woboq源代码浏览器,Qt源代码为conveniently available。有时源代码比任何文档都要好。如果您认为文档不完整,我相信可以很好地解决不足之处,并为您提供满意的帮助:)