QWizard:删除已访问页面的历史记录
我正在做一个项目,这个项目基本上是按照一个预先定义的结构来进行的,就像状态机或者向导一样。我发现了QWizard,它的nextId()函数看起来是个不错的办法,可以让我动态加载更多的页面。不过,我希望能够返回到之前已经访问过的页面。但即使我重载了nextId(),我还是无法返回到那些已经访问过的页面。
有没有办法清除已经访问过的页面历史记录?或者有没有更好的方法来实现这个功能?
我在用Python的PyQt4来使用Qt,不过这应该不会有太大影响。另一种实现我想要的功能的方法是给向导添加一个类似的页面,并与这个页面共享之前的数据,但因为我主要是用C++的,所以我不喜欢创建那些模仿原始对象的虚假对象。
编辑:我想做的是用QWizard复制一个状态机(因为它几乎就是一个状态机)。比如,在第1页加载数据,然后在第2页进行额外的计算,这可能会扩展第1页的数据。通过使用返回按钮,我可以回到第1页,但我不能通过下一步按钮“返回”,因为此时第1页已经被访问过了。我尝试重载nextId()函数,但没有成功。这意味着我无法构建一个循环的页面顺序,而我正想做到这一点。
2 个回答
我不太明白你提的这些问题之间有什么逻辑关系。如果你想返回到已经访问过的页面,那你为什么还想删除历史记录呢?
通过重载(也就是修改)nextID
方法,你可以在 QWizard
或者单独的 QWizardPage
中轻松实现你想要的任何自定义访问顺序。你可以使用 hasVisitedPage
方法来检查某个页面是否已经被访问过。visitedPages
会返回已经访问过的页面的ID列表,按照访问的顺序排列。
你还需要什么呢?
我之前也遇到过类似的需求。我在用 C++
开发一个应用程序,这个程序需要用到 QWizard
来处理硬件设备的许可和校准,但我发现 QWizard
没有提供返回到之前访问过的页面或ID的功能。
我想出了一个解决办法,用 C++
实现的。不过,你也可以很容易地把这个方法移植到 python
。在这里的文档中显示,pyqt
有 setStartId
和 restart
这两个方法。你可以用它们在 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();
}