Qt拥有'objects'(T*和常量T*)

Qt ownership of 'objects' (T* and const T*)

本文关键字:常量 objects 拥有 Qt      更新时间:2023-10-16

假设一个QObject有一个二传手拿指针是正确的吗:

  • 如果指针T*,将取得所有权并删除指针?

    示例:void QComboBox::setModel(QAbstractItemModel *)

  • 如果指针const T*,则不会获得所有权,也不会删除指针?

    示例:void QLineEdit::setValidator(const QValidator *)

没有严格的规则 - 在您的情况下,"接收对象"不会获得传递对象的所有权。

在所有权转让的情况下,它被记录在案,例如参见QComboBox::setLineEdit():

设置要使用的行编辑,而不是当前行编辑构件。 组合框拥有行编辑的所有权。

如果有所有权转让的情况没有记录在案,我认为这是一个Qt错误。

按照 piotrus 的建议将父项传递给验证器或模型始终是安全的。

QObject 获得所有权的唯一时间是当它成为另一个对象的父对象时,或者如果它被明确记录为获得所有权

QObject 在被删除时将删除其所有子项。要将子项添加到此类 QObject 中,必须建立适当的关系,即:

QObject* parent = new QObject();
QObject* child = new QObject(parent);
delete parent;//all the child objects will get deleted when parent is deleted

在您的示例中没有这样的语句,您应该调用

QAbstractItemModel ( QObject * parent = 0 )

将指针传递给函数或调用之前的构造函数

void QObject::setParent ( QObject * parent )
//Makes the object a child of parent.

在您的函数内。