2016-02-26 91 views
2

我有一個窗體(從QMainWindow繼承)與「設置」按鈕,需要顯示設置窗體(從QWidget繼承)。我是否需要刪除或關閉後?

按鈕點擊(),還有一些settingsButtonClick()插槽

而且在settingsButtonClick連接:

void MainQT::settingsButtonClick() 
{ 
    SettingsForm *settingsForm = new settingsForm(); 
    settingsForm->show(); 
} 

它可以正常工作,但問題是我應該需要的地方刪除此形式,或者它會被刪除時我關閉設置表單? 在這種情況下,我正確地管理內存的方式是什麼?我是否應該在隱藏MainForm的ctor中實例化設置窗體,並且只根據請求顯示?

+0

您需要手動刪除它。但爲什麼'新'它在第一位?爲什麼不只是'SettingsForm settingsForm; settingsform.show();'? – BoBTFish

+1

@BoBTFish因爲在你的情況下,表單會在顯示後立即被破壞。 –

回答

2

我會做下列方式:

void MainQT::settingsButtonClick() 
{ 
    SettingsForm *settingsForm = new settingsForm(); 
    settingsForm->setAttribute(Qt::WA_DeleteOnClose); 
    settingsForm->show(); 
} 

使用Qt::WA_DeleteOnClose將確保該settingsForm將在關閉之後被刪除。 欲瞭解更多詳情,請看Qt documentation

0

我應該在某處刪除此表單,否則當我關閉設置表單時它會被刪除?在這種情況下管理內存的正確方法是什麼?我是否應該在隱藏MainForm的ctor中實例化設置窗體,並且只根據請求顯示?

有沒有嚴格的規定,可能會:

  • 創建設置每次你需要顯示它,然後銷燬對象時對話框;
  • 在MainForm構造函數中創建設置對話框,然後僅在用戶操作時顯示它;
  • 你甚至可以使用設置對話框的contrainer存儲設置值

請你只注意,您的代碼創建新的對象,從來沒有破壞它,這將導致內存泄漏;考慮將指針保存爲成員變量並重新使用它,如果用戶另一次打開設置對話框:

void MainQT::settingsButtonClick() 
{ 
    if(!mSettingsForm) mSettingsForm = new settingsForm(); 
    settingsForm->show(); 
} 
相關問題