2011-04-26 51 views
2

我正在處理基本上遵循預定義結構的項目,如狀態機或嚮導。我偶然發現了QWizard,它的nextId()函數似乎是一個很好的方法,可以讓我的嚮導動態地加載更多的頁面。現在,回到之前已經訪問過的嚮導頁面將會非常好。但即使重載nextId()我也不能回到已經訪問過的頁面。QWizard:刪除已訪問頁面的歷史記錄

是否可以清除訪問過的頁面歷史記錄?還是有更好的方法來做到這一點?

我在Python中使用PyQt4的Qt,但這應該會有很大的不同。另一種做我要求的方法是向嚮導添加一個類似的頁面,並與此頁面共享以前的數據,但主要來自C++我不喜歡創建模仿原件的虛擬對象的方式。我試圖做的是複製一個狀態機與QWizard(因爲它幾乎是一個狀態機)。例如,在頁面1上加載數據,然後在頁面2上發生可能擴展頁面1數據的額外計算。通過使用後退按鈕,我可以返回到第1頁,但是我不能用下一個按鈕「返回」,因爲此時已經訪問了第1頁。我通過重載nextId()函數來嘗試它,但它不起作用。這意味着我無法建立一個循環的頁面順序,我想這樣做。

回答

0

我不確定我看到你在這裏問的不同問題之間的邏輯聯繫。如果你想回到已經訪問過的頁面,你爲什麼要刪除歷史記錄?

超載無論是QWizard或單獨QWizardPage S的nextID方法可以方便地實現任何你想要的自定義的訪問順序的幫助。使用hasVisitedPage方法來確定某個頁面是否已經被訪問過。 visitedPages按訪問頁面的順序返回訪問頁面的ID列表。

你還需要什麼?

+0

我編輯了問題以闡明 – DaClown 2011-04-26 10:57:25

0

我在過去有類似的要求。我正在開發C++中的應用程序,該應用程序需要QWizard用於我的Hardware Device的許可和校準,並且發現QWizard中沒有規定切換到先前訪問的頁面/ ID。

我想出了一個解決方法C++。但是,您可以輕鬆移植到python。通過here的文檔顯示pyqt具有方法setStartIdrestart。您可以使用它們來實現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(); 
}