2013-01-31 266 views
0

我有問題確保對話框關閉/釋放以下Qt代碼。QDialog關閉崩潰

//Segment 1: To open a 'wait' dialog for some long-running tasks 
void MainWindow::ui_showProgressDialog(QString title) { 
    dlgProgress = new QProgressDialog(title, tr("Cancel"), 0, 0, this); 
    dlgProgress->setAttribute(Qt::WA_DeleteOnClose); // line 1 
    dlgProgress->setModal(true); 
    dlgProgress->show(); 
    connect(voidWatcher, SIGNAL(finished()), 
      this, SLOT(onPopulationFile())); 
} 

//Segment 2: Attempts to close the 'wait' dialog 
void MainWindow::onPopulationFile() { 
    qDebug((dlgProgress == NULL) ? "true" : "false"); 
    if (dlgProgress) // 
    { 
     qDebug("0"); 
     dlgProgress->close(); // line 2 
     qDebug("1"); 
    } 
    qDebug((dlgProgress == NULL) ? "true" : "false"); 
} 

問題:當我觸發調用「ui_showProgressDialog」兩次,第二次呼叫總是崩潰我的程序。原來,我的代碼有沒有1段1號線,以及從QtCreator,它總是崩潰上段2調試信息的第二行顯示如下

// first call to onPopulationFile 
false 
0 
1 
false 
// second call to onPopulationFile 
false 
0 
*** CRASH ***  

,我讀了永不刪從不同的線程對象的文檔,我懷疑調用'onPopulationFile'是從非主線程調用的。所以我添加了第1行來分段,讓程序決定何時刪除對象。但它似乎不起作用。對這個問題的任何建議?

實驗做:如果我用了QDialog取代QProgressDialog,程序不用崩潰,而調試消息顯示

// first call to onPopulationFile 
false 
0 
1 
false 
// second call to onPopulationFile 
false 
0 
1 
false 

所以,

  • 爲什麼在段2的第二個空測試總是失敗? [編輯:我必須明確地設置變量爲NULL]
  • 有沒有更好的方法來關閉'等待'對話框?
  • 我試圖關閉/釋放對話框,因爲我希望儘快釋放內存。我真的需要手動刪除對話框嗎?

平臺:Qt的開源4.8(64),視窗7(64),MinGW的(rubenvb 4.7.2)

+0

什麼是'voidWatcher'和'finished'的目的是什麼? – UmNyobe

+0

voidWatcher的類型爲QFutureWatcher –

回答

3

dlgProgress->setAttribute(Qt::WA_DeleteOnClose);刪除該窗口小部件時它被關閉。當你打電話給dlgProgress->close();時,在這行之後它指向的對象已被釋放,而dlgProgress現在是一個無效指針。

您需要將dlgProgress設置爲空,在任何調用關閉或事件更好的情況下使用信號Qobject::destroyed()

編輯:

Qt::WA_DeleteOnClose指定,如果接近事件發生的對象將被刪除。不完全是需要多少時間。例如,如果他們使用QObject::deleteLater(),則該對象不會立即被刪除。即使情況並非如此,代碼如

A* a = new A; 
a->dosomething(); 
delete a; 
a->dosomething(); 

是未定義的行爲。對a->dosomething();的第二個電話可能會崩潰(如果幸運的話)或者不會崩潰。

+0

感謝您的評論,但1)qDebug("1")聲明不使用dlgProgress中的任何內容,爲什麼它不能顯示在調試信息中? 2)將信號銷燬()連接到哪裏? –

+1

我不是在說調試。第二次調用方法時,我正在談論崩潰的來源...... – UmNyobe

+0

第二次調用onPopulationFile的第一個「false」顯示在第二次調用中輸入onPopoulationFile時,「dlgProgress」不爲空。我的問題是爲什麼QDialog工作但QProgressDialog失敗! –