Qt 物件樹 《一》

2021-09-30 13:21:11 字數 1481 閱讀 9995

分類: 

c/c++

qobjects類以物件樹組織。建立的

qobjects

會自動新增到它的父物件的

childern()

列表中,並且父物件被刪除時,子物件也會被刪除。這種方法很適合

gui物件。例如:

qshortcut

是某個視窗的子物件,當使用者關閉這個視窗時,

qshortcut

物件就會被刪掉。

qquickitem是

qt quick

模組的基礎影象元素,派生自

qobject

,但也有父視窗的概念。乙個

item

的父視窗並不一定是它的父物件。

qwidget作為

qt widget

模組的視窗基礎型別,擴充套件了父子關係。在這樣的關係中,子物件通常也是子視窗,例如:它處於父視窗座標系統中並被父視窗的邊界夾住。當乙個對話方塊被關閉時,應用程式便把它刪除掉,對話方塊的按鈕和標籤也同樣被刪除掉了,因為按鈕和標籤都是對話方塊的子視窗。

也可以手動刪除子視窗,它們將會從父視窗中移除。例如,當使用者移除工具欄時會導致應用程式刪掉

q*******

物件中的乙個,同時工具欄的

qmainwindow

父視窗會檢測到變化並重置螢幕間距。

當應用程式看起來很奇怪時,

qobject::dumpobjecttree() and qobject::dumpobjectinfo()

是有用的工具。

物件建構函式和析構函式的順序

在堆上建立

qobjects

(使用new

建立)時,物件樹會以任何順序構造,並之後也以任何順序銷毀。當物件樹中有乙個

qobject

被刪除時,如果物件有父親,析構函式會自動地從它的父親移除該物件。如果物件有孩子,析構函式自動刪除每乙個孩子。不管析構函式的順序如何,沒有乙個

qobject

會被刪掉兩次。

當物件在棧上建立時,行為相同。正常情況下,析構函式的順序不會產生任何問題。

int main()

window和

quit

都是qobject

物件。quit

的析構函式並不會被呼叫兩次,因為

c++語言標準規定了現場物件的析構函式以它們的建構函式的相反順序被呼叫。

quit

的析構函式會被先呼叫,被它的父親刪除,

window

的析構函式隨後被呼叫。

但是如果交換建構函式的順序,如下所示:

int main()

在這個例子中,析構函式的順序就會造成問題。父親的析構函式首先被呼叫因為它後建立。它會先呼叫孩子

quit

的析構函式,這是不正確的,因為

quit

是乙個現場變數。隨後

quit

會超出範圍,它的析構函式再次被呼叫,這次是正確的,但破壞已經發生了。

qt 中的物件樹

本節內容講解了什麼是物件樹以及其所帶來的 gui 程式設計好處。最後說明了在物件樹中析構順序問題並舉了個特殊的例子,來說明平時程式設計中需要注意的乙個點。我們常常聽到 qobject 會用物件樹來組織管理自己,那什麼是物件樹?這個概念非常好理解。因為 qobject 類就有乙個私有變數 qlist,...

QT基礎知識(五)QT物件樹

qt使用物件樹來管理和組織object類或者及其所有子部件。當建立乙個object時,如果使用其他物件作為其父物件,那麼object就會被放置到其父物件的children 列表中。當父物件被銷毀時,這個object也會被銷毀。如下圖 設定樣式風格 brushcolor qt red 顏色 qdebu...

Qt物件樹和擁有權

1 qt智慧型指標和qobject物件樹系統 父子系統 結合使用出現的問題 2 qt學習筆記 六 之簡析物件樹 一 物件模型 標準c 物件模型可以在執行時非常有效的支援物件正規化 object paradigm 但是它的靜態特性在一些問題領域中不夠靈活。圖形使用者介面程式設計不僅需要執行時的高效性,...