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

时间:2014-02-03 12:44:12

标签: c++ qt user-interface wizard

我有一个由Qt Creator的表单向导生成的QWizard的子类。如文档中所述,我重新实现了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);
}

1 个答案:

答案 0 :(得分:3)

当调用nextId时,您已经致力于切换页面。在那时进行任何验证根本没有意义。

实际上,nextId实现执行任何验证或显示任何用户界面都是语义错误。可以根据实现的意愿调用它,并且您的代码应该处理它。试想一下这种方法的等价物。它是一种查询方法,与容器上的size方法不同。

要验证输入,您最好重新实现isComplete,或声明必填字段,或重新实现validateCurrentPage

validateCurrentPage调用

QWizard::next。如果它返回true,则调用nextId来查询要切换到的页面,并切换页面。私有switchToPage代码再次调用nextId以验证下一页是否无效。这是您遇到的双重呼叫的来源。

您的checkSettings来电根本不属于nextId。它们属于validateCurrentPage

通过woboq源代码浏览器,Qt源代码为conveniently available。有时源代码比任何文档都要好。如果你认为文件不完整,我肯定会很乐意接受一个做得好的贡献来解决这个问题:)