QT - 为什么用图形小部件指定父级?

时间:2012-09-21 15:53:30

标签: qt widget parent

问题: 使用Qt指定父级似乎总是一个好主意。但是我不明白为什么在某些特定情况下需要它。有很多使用QGraphicsView的例子如下:

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

那么为什么在这种特定情况下这比QGraphicsView *view = new QGraphicsView(NULL)?好呢?

谢谢你, 亚历

3 个答案:

答案 0 :(得分:4)

没有父级的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,或者稍后重新发布它并不重要。我认为两者都不是更好,但我总是做后者,因为它看起来更好。

答案 1 :(得分:2)

  

“用Qt指定父母似乎总是一个好主意”

有一个explanation

在这种情况下,最好指定父级,因为您不需要管理对象销毁。考虑使用多个窗口的应用程序。当NULL作为父对象时,所有对象及其资源在关闭窗口时仍然存在。所以你创建了内存泄漏。另一方面,如果您具有良好的对象层次结构,则关闭窗口将调用层次结构中的所有析构函数。关心的一个小错误...

  

您能解释父窗口如何知道子视图吗?

子项有一个内部功能,可以将自己添加到父对象中。这绝对用于QObject构造函数和QObjet::setParent(QObject * parent)方法。您可以从签名中注意到任何地方都没有const,这是因为子对象将修改父对象。

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

答案 2 :(得分:0)

我要感谢UmNyobe和Anthony帮助我弄明白。

无论如何,我不得不关注QT来源,找出幕后发生的事情。

所以我理解整个QObjects的想法如下。使用指定的父级创建新的QObject时,将调用隐藏的QObjectPrivate::setParent_helper(QObject *parent)函数。它确实将孩子与父母一起注册:

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

从技术上讲,创建一个有父母的孩子可以让父母注册孩子。因此,在创建子项时指定父项是一种有用的习惯。

在某些情况下,无论如何都会在稍后指定父子关系(请参阅Anthony的答案),因此可能未指定父母。