需要手动删除QValidator吗?

5

示例代码:

QDoubleValidator *validator = new QDoubleValidator();
myInputLineEdit->setValidator(validator);

// delete validator;

注意:myInputLineEdit是一个QLineEdit指针,并将随其父项一起被删除。
我的问题是,我应该在什么时候删除验证器?因为它是手动创建的,而setValidator()似乎不会根据文档拥有此指针。如果我不删除它,会出现内存泄漏吗?
我尝试像注释掉的代码一样立即删除它,然后注意到myInputLineEdit的验证器变为0。所以我认为我可能需要在myInputLineEdit被删除后再删除它。
另一个想法是,我可以给验证器一个父项,这样它就会随着其父项一起被删除,这是一个好方法吗?如果没有一个好的候选项来作为父项怎么办?
谢谢

1
如果你对 setValidator 为什么不拥有所有权感兴趣的话:可能是因为你可以将同一个验证器用于多个输入小部件,所以它是一种共享所有权。但是QObjects没有共享所有权,而是具有唯一的父级所有权,因此您需要将父级设置为某个小部件(无论是行编辑还是其父级,取决于哪个更合理)。 - leemes
2个回答

6
我试图像注释代码一样在 myInputLineEdit 之后删除它,然后发现 myInputLineEdit 的验证器变成了 0。所以我认为我需要在删除 myInputLineEdit 之后再删除它。 这是因为 QLineEdit 在内部使用 QPointer 跟踪 QValidator 对象是否被删除。 根据文档,setValidator() 确实不设置 QValidator 的父对象。 另一个想法是,我可以给验证器一个父对象,这样它就会随着其父对象一起被删除,这种做法好吗?如果没有一个好的候选者作为父对象怎么办? 您可以手动删除它,使用智能指针或像 @crayzeewulf 说的那样将 myInputLineEdit 设置为父对象(使用 QValidator 构造函数或 setParent())。父对象负责删除其子对象,因此这是一种可行的方法。通常分配验证器的对象是一个好的父对象。 如果您既没有设置父对象也没有删除它,则会出现内存泄漏。

谢谢大家。我没有使用myInputLineEdit作为父对象,因为我想为几个QLineEdit对象使用此验证器,如@leemes所提到的。因此,当其中一个被删除时会出现问题。我猜我在这里有两个选择:1. 为每个QLineEdit创建一个验证器;2. 由于所有这些QLineEdit对象都是一个常见类的成员,该类也是QObject类,因此我可以将其用作父对象。 - vlursk
@Leo,选择第二个选项。 - thuga

3
mInputLineEdit用作validatorparent,就像此处的示例一样。父对象的析构函数会销毁所有子对象(请参见此处)。这是“Qt方式”处理所有权树的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接