2012-09-21 50 views
0

問題: 用Qt指定父項似乎總是一個好主意。但我不明白爲什麼它在某些特定情況下是必需的。有下列方式使用的QGraphicsView的大量實例:QT - 爲什麼用圖形小部件指定父項?

MainWindow::MainWindow() 
{ 
    QGraphicsView *view = new QGraphicsView(this); 
    ... 
} 

那麼,爲什麼這比QGraphicsView *view = new QGraphicsView(NULL)?在這種特殊情況下更好?

謝謝 亞歷

回答

0

我要感謝UmNyobe和安東尼幫助我的數字出來。

無論如何,我不得不看QT的資料來弄清幕後的情況。

所以我理解如下的整個QObject概念。當使用指定的父對象創建新的QObject時,將調用隱藏的QObjectPrivate::setParent_helper(QObject *parent)函數。它的確註冊了父母的孩子:

parent->d_func()->children.append(q); // Strange, they didn't use `this` to register the object :) 

從技術上講,創建一個父母的孩子允許父母註冊孩子。因此,在創建孩子時指定父母是一種有用的習慣。

在某些情況下,無論如何都會指定父子關係(請參閱Anthony的回答),因此可能不指定父項。

+0

如果您有意將問題或答案投下,請不要忘記留下評論,解釋您認爲問題或答案錯誤的地方。 – Alex

3

一個QWidget沒有父實際上是一個頂層窗口。但是,有時候人們在創建QWidget時忽略指定父項,因爲父項會在稍後自動設置,例如當QWidget是佈局的一部分時。例如:

QGraphicsView *vew = new QGraphicsView; // the view has no parent 

QBoxLayout *layout = new QHBoxLayout; 
layout->addWidget(view); 

centralWidget()->setLayout(layout); // this automatically reparents the view to 'this' 

這其實並不重要,你是否通過this新的QGraphicsView,或稍後重新設置父級吧。我認爲兩者都不是更好,但我總是做後者,因爲它看起來更好。

+0

謝謝。這是我懷疑的 - 父視圖在兒童被「插入」到兒童視圖中時獲得了有關子視圖的意識,但是在創建子視圖時卻沒有。因此,創建「孩子」時不需要指定父項。我仍然會給UmNyobe一個闡述他的答案的機會。看到我對他的回答的評論。 – Alex

2

「指定使用Qt父母總是似乎是個好主意」

有一個explanation

在這種情況下,最好指定父項,因爲您不需要管理對象銷燬。想想有多窗口的應用程序。作爲父母的任何地方都有NULL,關閉窗口時,所有對象及其資源仍處於活動狀態。所以你創建內存泄漏。另一方面,如果你有一個好的對象層次結構,那麼關閉窗口將調用層次結構中的所有析構函數。減少一個bug ...

你能解釋一下父窗口是如何知道子視圖的嗎?

有一個內部功能讓孩子自己添加到父對象。這在QObject構造函數和QObjet::setParent(QObject * parent)方法中都是明確使用的。您可以從簽名注意到任何地方都沒有const,這是因爲子對象將修改父對象。

http://doc.qt.digia.com/4.7-snapshot/qobject.html#details

+1

謝謝,你能解釋一下,當父指針指向父指針時,父窗口是如何知道子視圖的嗎?是否有隱藏的「回調」(通過指向父指針),以某種方式將子視圖註冊到父級? – Alex