Qt владение «объектами» (T * и const T *)

2

Правильно ли предположить, что QObject с установщиком, берущим указатель:

  • Будет ли владение и удалить указатель, если указатель T*?

    Пример: void QComboBox::setModel(QAbstractItemModel *)

  • Не будет владеть и не удалять указатель, если указатель const T*?

    Пример: void QLineEdit::setValidator(const QValidator *)

Теги:
qt

3 ответа

4
Лучший ответ

Там нет строгого правила - в ваших случаях "объекты-получатели" не принимают права собственности на переданные объекты.

В тех случаях, когда право собственности передается, оно задокументировано, см., Например, QComboBox :: setLineEdit():

Устанавливает редактирование линии вместо текущего виджета редактирования строки. Поле со списком переходит к редактированию строки.

Если есть случаи передачи прав собственности, где они не задокументированы, я бы подумал, что ошибка Qt.

Передача родителя в валидатор или модель, как предложено piotrus, всегда безопасна.

  • 1
    Ответ дает мне некоторые аллергические реакции - смысл - сам код QT не имеет никакого понятия о собственности, кроме документации.
  • 0
    Ну, у него есть иерархия родительских и дочерних объектов QObject. Если принятие прав собственности имеет смысл или нет, действительно зависит от контекста - например, модель или валидатор могут совместно использоваться несколькими виджетами. Одно вступление во владение сломало бы это.
3

единственный раз, когда QObject получит право собственности, когда он становится родителем другого объекта или если он явно документирован, чтобы взять на себя ответственность

1

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.

внутри вашей функции.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню