问题:使用 Qt 指定父级似乎总是一个好主意。但是我不明白为什么在某些特定情况下需要它。有很多以下列方式使用 QGraphicsView 的例子:
MainWindow::MainWindow()
{
QGraphicsView *view = new QGraphicsView(this);
...
}
那么为什么这比QGraphicsView *view = new QGraphicsView(NULL)?
在这种特定情况下更好呢?
谢谢你,亚历克斯
没有父级的 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 或稍后重新设置它并不重要。我不认为两者都更好,但我总是做后者,因为它对我来说看起来更好。
“用 Qt 指定父母似乎总是一个好主意”
有一个解释。
在这种情况下,最好指定一个父对象,因为您不需要管理对象销毁。考虑一个具有多个窗口的应用程序。以NULL
任何地方为父对象,当您关闭窗口时,所有对象及其资源仍然存在。因此,您会造成内存泄漏。另一方面,如果您有一个良好的对象层次结构,那么关闭窗口将调用层次结构中的所有析构函数。少一个需要关心的错误...
你能解释一下父窗口是如何知道子视图的吗?
子对象有一个内部功能可以将自己添加到父对象。这肯定在QObject
构造函数和QObjet::setParent(QObject * parent)
方法中都使用了。您可以从签名中注意到没有const
任何地方,这是因为子对象会修改父对象。
我要感谢 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 :)
所以从技术上讲,用父母创建一个孩子允许父母注册孩子。因此,在创建孩子时指定父母是一个有用的习惯。
在某些情况下,无论如何都会稍后指定父子关系(请参阅安东尼的回答),因此可能未指定父子关系。