2011-06-03 30 views
0

我有一個由中央應用程序創建和管理的對話框。該對話在運行時生成小部件,並具有用於將對話恢復到其默認安排的成員函數,即,即,頂部的按鈕框和底部的單個小部件。這個恢復功能在對話被隱藏時被調用。我可以從對話中獲得額外的小部件,但我無法讓對話本身縮小到原始大小。這是我正在使用的代碼,名稱已更改爲通用。通過函數調用縮小QDialog

void Dialogue::restore() 
{ 
    const short RESTORE_WIDTH = 800; 
    const short RESTORE_HEIGHT = 200; 
    QRect newGeometry(frameGeometry()); 

    // Remove all old origins 
    foreach(RuntimeWidget* child, findChildren< RuntimeWidget* >()) 
     child->deleteLater(); 

    // Restore widget to default state 
    newGeometry.setWidth(RESTORE_WIDTH); 
    newGeometry.setHeight(RESTORE_HEIGHT); 
    setGeometry(newGeometry); 
    updateGeometry(); 
    addRuntimeWidget(); 
} 

void Dialogue::addRuntimeWidget() 
{ 
    RuntimeWidget* pWidget(new RuntimeWidget()); 

    vbxlytDialogue->addWidget(pWidget); 
    adjustSize(); 
    adjustPosition(this); 
    pWidget->setFocus(Qt::OtherFocusReason); 
} 

回答

2

我猜你在這裏使用deleteLater有問題。只有當你回到主事件循環後,子部件纔會被刪除,並且在restore()完成後(即在撥打adjustSize後),將只發生

您是否曾嘗試在調用deleteLater()之前從其佈局中刪除子窗口小部件?

foreach(RuntimeWidget* child, findChildren< RuntimeWidget* >()) { 
    vbxlytDialogue->removeWidget(child); 
    child->deleteLater(); 
} 

(或者類似的意思 - 我只是猜測的vbxlytDialogue類型。)

+0

我沒有,現在給它一個嘗試。 – JadziaMD 2011-06-06 18:04:46

+0

工作得很好,除了現在下一次添加的調用之外,對於調整大小以適應新的小部件並沒有很好的工作。這是第一次調用後的下一次調用,父窗口小部件實際上已經過調整以適應新的窗口小部件。 – JadziaMD 2011-06-06 18:09:51