2015-11-10 37 views
0

我正在使用QProgressDialog來顯示在QTreeView中從數據庫加載數據的進度。我使用信號和插槽發送記錄數量和當前記錄。這是段代碼:正確使用QProgressDialog

void MainWindow::loadDataUpdate(int value, int max) 
{ 
    if ((max > 0) && (value == 0)) 
    { 
     m_progressDialog = new QProgressDialog("Warming up - please wait ...   ", "Cancel", value, max , this); 

     m_progressDialog->setMinimumDuration(2); 
     m_progressDialog->setWindowModality(Qt::WindowModal); 
     m_progressDialog->setAttribute(Qt::WA_DeleteOnClose); 
     m_progressDialog->setCancelButton(0); 
     m_progressDialog->setWindowTitle(this->windowTitle() ); 
    } 
    if ((value == max) && (max > 0)) 
    { 
     m_progressDialog->setValue(m_progressDialog->maximum()); 
     return; 
    } 
    m_progressDialog->setValue(value); 
} 

m_progressDialog在.h文件中爲聲明:

QProgressDialog* m_progressDialog; 

所以,發送一個零值和最大值創建對話框,並設置它。

我遇到的問題是,如果用戶通過單擊右上角的十字或使用alt-F4關閉ProgressDialog窗體,則會發生錯誤。這大概是因爲我正在使用Qt :: WA_DeleteOnClose。

我想要做的是檢測到對話框已關閉並再次打開,或提供關閉整個應用程序或繼續。

如何測試進度對話框是否已關閉?

或者阻止它被關閉?

回答

1

QProgressDialog爲此提供了一個cancelled信號。你可以連接到它,並顯示對話框,或做任何你想要的。

所以,你需要做的是建立一個適當的插槽中,然後將其連接到信號:

connect(m_progressDialog, &QProgressDialog::canceled, this, &MainWindow::onDialogCanceledSlot); 

<..> 
//add a slot to your window class: 
class MainWindow 
{ 
public slots: 
    void onDialogCanceledSlot() 
    { 
     m_progressDialog->show();//for example. 
    } 
} 

,如果你只是想表明它回來,你可以使用lambda:

connect(m_progressDialog, &QProgressDialog::canceled, [&](){ 
    m_progressDialog->show(); 
}); 

請注意,在使用WA_DeleteOnClose時(因爲對話框被刪除了),您仍然無法做到這一點,因此我建議您不要設置WA_DeleteOnClose,而應將對話框存儲在QScopedPointer中。這樣您就可以重新使用它(不需要重新創建),並且當您的MainWindow死亡時它將被正確刪除。

+0

感謝您的回答。我把lambda連接代碼放在我的問題的setWindowTitle()行之後,並刪除DeleteOnClose行。當窗體關閉時,似乎並沒有發出取消的信號。我把lambda連接放在適當的地方嗎?再次感謝。 –