父母和二传手

时间:2014-03-24 19:45:25

标签: c++ qt user-interface memory-management

这是一个普遍的问题,我将用两个例子说明。

第一个例子:假设我有一个小部件和一个与之关联的布局:

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

请注意,我已将我的窗口小部件指定为布局的父级。问题是,这是否足以将布局与我的小部件相关联,或者我是否必须另外明确地将布局设置为:

myWidget.setLayout(mainLayout);

如果我必须明确设置布局,那么AFAIK设置也会使myWidget成为我的布局的父级,那么在构造函数中指定父级是什么意思?

第二个例子:

假设我有一个行编辑和验证器。

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

请注意,我已为验证程序设置了父级。为了使验证器能够工作",即收听lineEdit的值变化事件,我是否还必须明确设置验证器,如

lineEdit->setValidator(validator);

如果是这样,setValidator函数本身是否会设置父项,如果是这样,我为什么要在Validator的构造函数中指定父项?

希望我的问题很明确。

1 个答案:

答案 0 :(得分:2)

写第一个问题:

我认为QWidget::setLayout()函数调用并将父窗口小部件设置为布局是等效的操作。这非常适合QWidget::setLayout()的{​​{3}}:

  

调用此函数的另一种方法是将此窗口小部件传递给布局的构造函数。

因此,如果已经为布局设置了父窗口小部件,则需要调用QWidget::setLayout()

写第二个问题:

当您使用行编辑作为父编译构造验证程序时,您不会将验证程序设置为行编辑 - 这只是定义QObjects层次结构和对象所有权。我认为你不需要在这里混合分层和功能概念。