QWizard:删除已访问页面的历史记录

2 投票
2 回答
741 浏览
提问于 2025-04-16 16:25

我正在做一个项目,这个项目基本上是按照一个预先定义的结构来进行的,就像状态机或者向导一样。我发现了QWizard,它的nextId()函数看起来是个不错的办法,可以让我动态加载更多的页面。不过,我希望能够返回到之前已经访问过的页面。但即使我重载了nextId(),我还是无法返回到那些已经访问过的页面。

有没有办法清除已经访问过的页面历史记录?或者有没有更好的方法来实现这个功能?

我在用Python的PyQt4来使用Qt,不过这应该不会有太大影响。另一种实现我想要的功能的方法是给向导添加一个类似的页面,并与这个页面共享之前的数据,但因为我主要是用C++的,所以我不喜欢创建那些模仿原始对象的虚假对象。

编辑:我想做的是用QWizard复制一个状态机(因为它几乎就是一个状态机)。比如,在第1页加载数据,然后在第2页进行额外的计算,这可能会扩展第1页的数据。通过使用返回按钮,我可以回到第1页,但我不能通过下一步按钮“返回”,因为此时第1页已经被访问过了。我尝试重载nextId()函数,但没有成功。这意味着我无法构建一个循环的页面顺序,而我正想做到这一点。

2 个回答

0

我不太明白你提的这些问题之间有什么逻辑关系。如果你想返回到已经访问过的页面,那你为什么还想删除历史记录呢?

通过重载(也就是修改)nextID 方法,你可以在 QWizard 或者单独的 QWizardPage 中轻松实现你想要的任何自定义访问顺序。你可以使用 hasVisitedPage 方法来检查某个页面是否已经被访问过。visitedPages 会返回已经访问过的页面的ID列表,按照访问的顺序排列。

你还需要什么呢?

1

我之前也遇到过类似的需求。我在用 C++ 开发一个应用程序,这个程序需要用到 QWizard 来处理硬件设备的许可和校准,但我发现 QWizard 没有提供返回到之前访问过的页面或ID的功能。

我想出了一个解决办法,用 C++ 实现的。不过,你也可以很容易地把这个方法移植到 python。在这里的文档中显示,pyqtsetStartIdrestart 这两个方法。你可以用它们在 python 中实现这个逻辑。

LicenseWizard::LicenseWizard(QWidget *parent)
    : QWizard(parent)
{
    setPage(Page_Intro, new IntroPage);
    setPage(Page_Evaluate, new EvaluatePage);
    setPage(Page_Register, new RegisterPage);
    setPage(Page_Details, new DetailsPage);
    setPage(Page_Conclusion, new ConclusionPage);

    setStartId(Page_Intro);

#ifndef Q_WS_MAC
    setWizardStyle(ModernStyle);
#endif
    setOption(HaveHelpButton, true);
    setPixmap(QWizard::LogoPixmap, QPixmap(":/images/logo.png"));

    connect(this, SIGNAL(helpRequested()), this, SLOT(showHelp()));
    QAbstractButton *b = this->button(QWizard::BackButton);
    connect(b, SIGNAL(clicked()), this, SLOT(goToSecondPage()));

    setWindowTitle(tr("License Wizard"));
}

void LicenseWizard::goToSecondPage()
{
    setStartId(Page_Evaluate);
    restart();
}

撰写回答