问题: 使用Qt指定父级似乎总是一个好主意。但是我不明白为什么在某些特定情况下需要它。有很多使用QGraphicsView的例子如下:
MainWindow::MainWindow()
{
QGraphicsView *view = new QGraphicsView(this);
...
}
那么为什么在这种特定情况下这比QGraphicsView *view = new QGraphicsView(NULL)?
好呢?
谢谢你, 亚历
答案 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
,这是因为子对象将修改父对象。
答案 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的答案),因此可能未指定父母。