为什么 QWizard::nextId() 被调用两次?

sor*_*h-r 0 c++ user-interface qt wizard

我有一个QWizard由 Qt Creator 的表单向导生成的子类。如文档中所述,我重新实现nextId()以验证输入并创建非线性向导。问题是它nextId()被调用两次:一次在进入页面时,一次在退出时。我需要对字段进行简单的最后一刻检查,然后引导用户浏览下一页,或显示错误消息并使用户保持在当前页面。

注意:我使用 Qt Creator 的表单生成器制作了向导。页面包含在 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);
}
Run Code Online (Sandbox Code Playgroud)

Rei*_*ica 5

当被呼叫时nextId,您已经承诺要切换页面。此时进行任何验证根本没有意义。

事实上,让nextId实现执行任何验证或显示任何用户界面是一个语义错误。它可以根据实现的需要多次调用,并且您的代码应该能够处理它。想想这个方法相当于什么。它是一种查询方法,size与容器上的方法没有什么不同。

要验证输入,理想情况下您应该重新实现isComplete,或声明必填字段,或重新实现validateCurrentPage

validateCurrentPage被称为QWizard::next. 如果返回true,则nextId调用then查询要切换到的页面,并进行页面切换。私有switchToPage代码再次调用nextId以验证下一页是否无效。这就是你所经历的双重召唤的根源。

你的checkSettings电话根本不属于其中nextId。他们属于validateCurrentPage.

通过 woboq 源代码浏览器可以方便地获取Qt 源代码。有时源代码比任何文档都更好。如果您认为文档不完整,我相信修复缺陷的出色贡献将很乐意接受:)