Qt Widget和Dialog區別和使用,QWidget一閃而過
阿新 • • 發佈:2019-01-31
在開發過程發現子視窗的解構函式沒有執行,後來查詢發現,在建立物件的時候沒有傳遞this指標
例如Model *model = new Model();和Model *model = new Model(this);this指標沒有傳遞,因此無法呼叫子物件的解構函式。
當子物件定義為指標,會出現因為沒有被釋放而無法被釋放的現象,當關閉子窗體時不會呼叫解構函式,只有關閉父窗體時,才會呼叫子窗體的解構函式,可以設定this->setAttribute(Qt::WA_DeleteOnClose)來呼叫父類析構
回到QWidget和QDialog的問題上,當我把子物件QWidget定義為指標時,因為父物件被關閉,導致子物件的指標無法被釋放,解構函式不能被執行。而把QWidget子物件定義為區域性變數的時候,視窗卻一閃而過,因為子物件作為佈局變數,很快就是系統釋放了,所以視窗一閃而過。
當子視窗繼承QDialog的時候,因為QDialog起了一個事件迴圈exec,不會出現視窗一閃而過的現象。
因此,當子視窗繼承QWidget的時候,一定要注意指標的傳遞,如果父物件被關閉,可以通過設定子視窗this->setAttribute(Qt::WA_DeleteOnClose)來呼叫父類解構函式。