Qt物件樹和QObject的構建 銷毀順序

2021-10-06 17:14:00 字數 1317 閱讀 8750

當以乙個物件作為父物件建立qobject時,這個物件就會被新增到父物件的children()列表中,當父物件被delete時該物件也會被釋放。

在析構乙個物件obj時,會進行兩個操作:

記住,qt主要用來開發圖形使用者介面程式。這種物件的組織方法非常適合gui物件的需求,

例如,qshortcut(鍵盤快捷方式)是相關視窗的子級,當使用者關閉該視窗時,該快捷鍵也會被刪除。

不僅如此,qwidget作為qt widgets模組的基本類(所有使用者介面物件的基類),它還擴充套件了qobject的父子關係。

乙個qwidget的子級成為了子級小部件,它在其父級的座標系中顯示,並根據其父級的邊界以圖形方式進行裁剪

例如,當應用程式在關閉後刪除訊息框時,訊息框的按鈕和標籤也會被刪除,因為按鈕和標籤是訊息框的子級。

根據物件建立方式需要分為兩種情況來討論:

1.在堆上建立(使用new建立)

當在堆上建立qobject時(即用new建立),可以以任何順序建立物件、構造物件樹。也可以以任何順序銷毀樹中的物件。

2.在棧上建立

在棧上建立qobject時,通常銷毀順序仍然不會出現問題。

看下面這個例子:

int

main()

quitwindow的子物件。根據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 關鍵字,提取訊號與槽的所有及對應的資訊索引,並為訊號...