2011-05-10 71 views
1

在我之前的主題中,人們在這裏告訴我,每個小部件都有一個父項,這有助於刪除情況,即,當父項被刪除時,子項會自動拋出out到/ dev/null。QWidget * parent作爲用戶定義的類的構造函數中的參數

現在我看到QWidget的*父被傳遞到用戶定義的類的構造函數在這裏,在這個環節上:http://doc.qt.io/archives/qt-4.7/tutorials-addressbook-part1.html 類通訊錄:公衆的QWidget { Q_OBJECT

public: 
    AddressBook(QWidget *parent = 0); 

private: 
    QLineEdit *nameLine; 
    QTextEdit *addressText; 
}; 

這說明什麼?

+0

只是一個簡單的問題:你瞭解Qt的父子關係?也就是說,小工具通常如何彼此「連接」? – Bart 2011-05-10 10:12:40

+0

感謝您的回覆,我只理解上面提到的內容。當父母被刪除時,孩子也被拋出,這就是我所理解的。現在這與上面用戶定義的類有什麼關係? – 2011-05-10 10:15:50

回答

3

Qt的Widgets,特別是在組合它們時,定義了一個層次結構。我們用一個(簡化的)例子來看這個。

在我的應用程序中,我有一箇中央QWidget。最重要的是另外兩個小部件。用於某些3D渲染的QGLWidget和用於控件的QTabWidget。這兩個小部件是我的中央QWidget的孩子。

QTabWidget有選項卡,它們是QWidgets本身。那些QTabWidget的孩子似乎是合乎邏輯的,對嗎?

我可以繼續。也許其中一個標籤有一些按鈕,另一個標籤一些文本框,不管。

你在這裏做的是創建一個QWidgets層次結構。所以在這個例子的情況下,它會看起來像這樣:

QWidget (the Central Widget) 
| 
|-QGLWidget (my rendering window) 
|-QTabWiget (the tab widget for my controls) 
| 
|-QWidget (the first tab) 
|| 
||-QPushButton (a button on the first tab) 
| 
|-QWidget (the second tab) 
    | 
    |-QLineEdit (a widget to provide some input) 

無論如何,你趕上我的漂移。 回到你的代碼,你可以通過QWidget的構造函數(或任何派生的窗口小部件)來定義這個層次結構。如果我創建了我的QGLWidget,那麼在它的構造函數中,我將提供一個指向我的中心QWidget的指針作爲它的父類。

這個層次結構有幾個原因。你提到了創建/刪除。但也想象一下,如果你切換標籤。該選項卡頂部應顯示哪些元素?它的孩子當然。如果你開始使用Qt,你會學習佈局。將佈局設置爲小部件將影響該小部件的所有子項。還有其他幾個原因(事情發生在幕後),但現在這應該足夠了。

我的解釋是相當概念化的。也許這不是技術上最詳細和最正確的解釋,但它應該給你一些指示。

回到你的代碼示例。 AddressBook來自QWidget。如果你把它放在你的GUI中,你可能想把它放在另一個Widget之上。作爲它的孩子。所以如果你添加這個AddressBook,你可以告訴它它的父母是什麼。在這個例子中它沒有被使用。 AddressBook本身就是最頂級的部件。但它可以輕鬆地成爲層次結構的一部分。

相當多的文字,但我希望它有點解釋的概念。看看Qt附帶的一些示例。你應該知道事情的結構。如果您沒有看到它們的連接方式,請按照上述步驟繪製圖表。它應該開始對你有意義。如果有人有更正或更多的技術洞察可能是有用的,請隨時評論或糾正我。

希望有所幫助。

1

該構造函數建立窗口小部件之間的父子關係。

除了內存管理和組織(也適用於普通的QObject)和佈局(這不是強制性的 - 您可以在父級佈局之外擁有子窗口小部件),父 - 子關係對QWidgets有一個有趣的轉折:

任何沒有父對象的QWidget都將成爲一個窗口,並且在大多數平臺上將被列在桌面的任務欄中。

(從Window and Dialog Widgets採取的Qt 4.7文檔)。

相關問題