Управление памятью для наборов виджетов в QT

Извините за немой вопрос, но я работаю со спокойным и C++ впервые и работаю через учебное руководство и некоторые образцы.

Одна вещь, которая была упомянута, состояла в том, что спокойный материал не должен быть явно удален. Так, основной вопрос, это также относится к наборам спокойного материала? Как говорят, что я хочу динамическое количество MyWidgets, таким образом, я сохраняю a vector или безотносительно их. Они все еще заботятся о для меня?

Как вопрос о стороне, что продолжает делать его так, я не должен волноваться о деструкторах?

5
задан J Cooper 3 March 2010 в 18:52
поделиться

2 ответа

Qt наверняка имеет интересную объектную модель. Когда я только начинал, меня беспокоило то, что было так много новых вызовов Foo и никаких delete s.

http://qt.nokia.com/doc/4.6/object.html Это хорошее место, чтобы начать изучение объектной модели.

Интересные факты: у подклассов QObject отключены методы присваивания и копирования. Цепочка дочерних и родительских объектов поддерживается внутри QObject.

Обычно при создании экземпляра подкласса QObject (если вы не планируете самостоятельно управлять его указателем) вы предоставляете другой указатель QObject в качестве родителя. Затем этот «родитель» берет на себя управление только что созданным вами ребенком. Вы можете вызвать setParent () для QObject, чтобы изменить, кто им «владеет». В Qt очень мало методов, которые изменяют родительский объект объекта, и все они явно заявляют об этом в документации.

Итак, чтобы ответить на ваш конкретный вопрос: это зависит от того, как вы создали все свои экземпляры MyWidget.

Если вы создали каждую из них вместе с родителем, то нет, вам не нужно их удалять. Родитель удалит их, когда он будет удален.

Если вы храните их коллекцию QList и не указали им родителя, то вам следует удалить их самостоятельно.

5
ответ дан 13 December 2019 в 05:34
поделиться

Модель управления памятью Qt основана на соотношении родитель-ребенок. Классы Qt принимают необязательно parent в качестве параметра своего конструктора. Новый экземпляр регистрируется с этим родителем таким образом, что он удаляется, когда удаляется родитель. Если вы используете коллекцию Qt (например, QList), я полагаю, что вы можете установить список в качестве родителя его записей. Если вы используете std::vector или другой тип коллекции, вы не получите "автоматического" управления памятью.

Модель Qt делает много смысла в иерархии пользовательского интерфейса, где она совпадает один к одному с иерархией пользовательского интерфейса. В других случаях, она не всегда отображается так чисто, и вы должны оценить, имеет ли использование системы Qt смысл для конкретной ситуации. Обычные инструменты C++ все еще работают: вы можете использовать std::tr1::shared_ptr или любой из других умных классов указателей, чтобы помочь вам управлять временем жизни объекта. Qt также включает QPointer, защищённый указатель, и пару QSharedPointer/QWeakPointer, которые реализуют умный указатель с вычислением ссылок и пару слабых ссылок.

7
ответ дан 13 December 2019 в 05:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: