2014-03-24 81 views
1

這是一個普遍的問題,我將用兩個例子來說明。家長和二傳手

第一個例子:假設我有一個小部件,與之相關聯的佈局:

QWidget myWidget; 
QVBoxLayout* mainLayout = new QVBoxLayout(&myWidget); 

注意,我指定我的widget作爲我的佈局的父。問題是,這足以佈局與我的小部件相關聯,或者我必須在另外明確設置佈局:

myWidget.setLayout(mainLayout); 

如果我必須明確地設置佈局,然後AFAIK設置也會做進myWidget我的佈局的父項,那麼在構造函數中指定父項的要點是什麼?

第二個例子:

假設我有一個行編輯和一個驗證器。

QLineEdit* lineEdit = new QLineEdit(whatever); 
QIntValidator* validator = new QIntValidator(0, 100, lineEdit); 

請注意,我已經爲我的驗證器設置了父項。爲了驗證爲「工作」,即聽lineEdit的值更改事件,我也有明確設置驗證在

lineEdit->setValidator(validator); 

如果是這樣,將setValidator將函數本身設定的父母,如果那麼,爲什麼我應該在校驗器的構造函數中指定父項呢?

希望我的問題很明確。

+0

如果您看看Qt文檔中的示例,大多數(all?)都不會「在構造函數中指定父項」,以免用於小部件和佈局。你可能不應該。 – Mat

+0

@Mat:你的意思是說,在這兩種情況下,我都*必須調用set ***函數? –

+0

當您使用行編輯構造驗證器作爲父項時,您不會將驗證器設置爲行編輯 - 這僅僅定義了QObject的層次結構和對象所有權。我認爲你不需要在這裏混合分層和功能的概念。 – vahancho

回答

2

WRT的第一個問題:

我覺得QWidget::setLayout()函數調用父控件設置佈局是等價的操作。這幾乎是千篇一律的Qt documentation,對於QWidget::setLayout()規定:

調用該函數另一種方法是這個小部件傳遞到佈局的構造。

因此,你確實需要調用QWidget::setLayout()如果父widget已設置的佈局。

WRT第二個問題:

當你構建具有行編輯只要你不設置驗證到線編輯父驗證 - 這只是定義的QObject層次和對象的所有權。我認爲你不需要在這裏混合分層和功能的概念。