2012-06-22 61 views
0

我懷疑我試圖彎曲一個QWizardPage做比應付更多的事情,這就是爲什麼我遇到問題,但也許有辦法做到這一點。在嚮導頁面上處理取消

因此,我有一個QWizard內的頁面數量和一個特定的頁面上運行一系列的測試針對某些硬件,然後將結果存儲在數據庫中。我希望能夠在必要時取消。然而,目前取消按鈕是QWizard的一部分,所以我不知道如何處理它。

我知道我可以在此改變的QWizardreject()功能,然後確定當前頁面,如果是我很感興趣,那麼頁面做一些事情,但我寧願不togehter扳平頁,這樣,除非我必須。

我曾嘗試到rejected()信號連接到這樣的嚮導:

connect(this, SIGNAL(rejected()), ui->runTestPage, SLOT(on_rejected())); 

但這無論如何立即關閉網頁之前,我可以顯示任何內容返回給用戶說我取消。

我可以在嚮導頁面上添加一個按鈕,當測試運行時會顯示一個按鈕以允許取消,但是頁面仍然有主取消按鈕。事實上,即使在測試完成後,取消仍然顯示,以便能夠刪除或禁用,看起來合適。

那麼,這是我可以做或我需要重新訪問嚮導的整個使用?

回答

2

是的,它是可行的。首先,您不一定需要覆蓋rejected(),我會沿着擺脫QWizard取消按鈕的路線行進,而是將您自己的QPushButton(或其中任何一個)指向自己的位置,執行「取消立即」消息框從那裏開始,然後觸發rejected()插槽。

它將爲您節省很多頭疼的按摩默認信號/插槽,並允許您替換'取消'與'關閉',這可能在一個嚮導的上下文更有意義(取決於嚮導,功能等)等)。

+0

感謝您的。這聽起來是個不錯的選擇,儘管越多我彎曲嚮導所做的事情越多,我認爲我可以通過創建自己的嚮導和類似堆疊小部件的方式完成此操作:)但是,無論如何,這對我有用 – Firedragon

4

一種方法是從cancel按鈕的clicked()信號斷開向導的reject()插槽,然後從那裏你問用戶,如果他真的相信,像這樣連自己的插槽:

在你的嚮導的構造函數:

// install a slot handling the cancel button, but disconnect the default slot that would close the wizard first 
disconnect(button(QWizard::CancelButton), SIGNAL(clicked()), this, SLOT(reject())); 
connect(button(QWizard::CancelButton), SIGNAL(clicked()), this, SLOT(cancelWizard())); 

然後實現自己的插槽處理取消:

void SetupWizard::cancelWizard() { 
    if(QMessageBox::question(this, trUtf8("Quit Setup"), trUtf8("Setup is not complete yet. Are you sure you want to quit setup?"), QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) { 
     // allow cancel 
     reject(); 
    } 
}