當以乙個物件作為父物件建立qobject時,這個物件就會被新增到父物件的children()列表中,當父物件被delete時該物件也會被釋放。
在析構乙個物件obj時,會進行兩個操作:
記住,qt主要用來開發圖形使用者介面程式。這種物件的組織方法非常適合gui物件的需求,
例如,qshortcut(鍵盤快捷方式)是相關視窗的子級,當使用者關閉該視窗時,該快捷鍵也會被刪除。不僅如此,qwidget作為qt widgets模組的基本類(所有使用者介面物件的基類),它還擴充套件了qobject的父子關係。
乙個qwidget的子級成為了子級小部件,它在其父級的座標系中顯示,並根據其父級的邊界以圖形方式進行裁剪。
例如,當應用程式在關閉後刪除訊息框時,訊息框的按鈕和標籤也會被刪除,因為按鈕和標籤是訊息框的子級。根據物件建立方式需要分為兩種情況來討論:
1.在堆上建立(使用new建立)
當在堆上建立qobject時(即用new建立),可以以任何順序建立物件、構造物件樹。也可以以任何順序銷毀樹中的物件。
2.在棧上建立
在棧上建立qobject時,通常銷毀順序仍然不會出現問題。
看下面這個例子:
int
main()
quit
是window
的子物件。根據c++語言標準,以與建構函式相反的順序呼叫本地物件的析構函式,那麼在程式結束時,quit
的析構函式將會先被呼叫,它將自己從其父物件中移除。隨後,window
的析構函式被呼叫,由於quit
已從window
的children中移除,quit
的析構函式不會被呼叫兩次。銷毀正常。
需要注意的是這種情況:
int
main()
根據建立順序,window
會先被析構,它也將呼叫它的所有children的析構函式,即quit
的析構函式會在此時被呼叫。隨後,quit
這個區域性變數的析構函式會再一次被呼叫,也就是說quit
的析構函式呼叫了兩次。
在這種情況下,銷毀順序出現了問題。因此,在編碼時需要注意物件的建立順序,最好按照父先子後的順序進行建立。
QT中的巨集 Q OBJECT
只有繼承了qobject類的類,才具有訊號槽的能力。所以,為了使用訊號槽,必須繼承qobject。凡是qobject類 不管是直接子類還是間接子類 都應該在第一行 寫上q object。不管是不是使用訊號槽,都應該新增這個巨集。這個巨集的展開將為我們的類提供訊號槽機制 國際化機制以及 qt 提供的不...
Qt之Q OBJECT巨集的作用
只有加入了q object,你才能使用qt中的signal和slot機制。凡是qobject類 不管是直接子類還是間接子類 都應該在第一行 寫上q object。不管是不是使用訊號槽,都應該新增這個巨集。這時候,就必須在標頭檔案派生類的時候,首先像下面那樣引入q object巨集 class mym...
Qt 原始檔中的 Q OBJECT
q object 為qobject 物件提供了訊號與槽的基礎,如果我們需要使用訊號與槽,最簡單方便的方式就是繼承qobject,並在類開頭放置q object 這個巨集,在預編譯前moc 會自動掃瞄所有標頭檔案,根據 signals 和 slot 關鍵字,提取訊號與槽的所有及對應的資訊索引,並為訊號...