Я пишу программу просмотра изображений с Qt, основанную на функции QGraphicsScene в Qt. Я создаю модель каждого изображения в классе с именем ImageModel и управляю отображением изображения в классе с именем ImageView. Класс ImageView выглядит следующим образом (просто интересная часть):
class ImageView
{
public:
ImageView(QWidget *parent);
QGraphicsView * getView() {return view; }
private:
//qgraphics scene elements
QGraphicsScene *scene;
QGraphicsView *view;
QGraphicsPixmapItem *curItem;};
Конструктор для класса выглядит следующим образом:
ImageView::ImageView(QWidget *parent)
{
//create scene and view with parent the main window
//such that the memory management is done by qt
scene = new QGraphicsScene(parent);
view = new QGraphicsView(parent);
view->setScene(scene);
}
Также у меня есть указатель на ImageView в моем происхождении QMainWindow.
Мой вопрос: должен ли я позволить Qt управлять памятью, установив главное окно в качестве родителя вида и сцены, или я должен сам позаботиться об управлении памятью (оставить вид и сцену без родителей и удалить их в классе деструкторов)? Что такое хорошая стратегия в этом случае?
Если вы хотите, чтобы представление было вложено в главное окно, вы иметь сделать это ребенком.
Для вашего общего вопроса это действительно сводится к желаемому времени жизни объекта и семантике владения. Если вы не хотите, чтобы представление / сцена переживали главное окно, тогда да, это должны быть дети. У вас все еще есть возможность удалить их другими способами в более раннее время.
Если они вам больше не нужны, есть ли у вас причина держать их рядом в течение всей жизни родителя? Если нет, я не понимаю, почему вы хотите оставить эту память выделенной.
Если вам больше не нужен ресурс, вы должны освободить его, если у вас нет причин не делать этого. Обратите внимание, что вы можете удалить их независимо от того, есть у них родитель или нет; когда вы удаляете объект, у которого есть родитель, он удаляет себя из списка потомков родителя.
Пусть Qt позаботится об удалении. Это удобно и безопасно. Не храните ссылки, которые вам не нужны. Например, добавление макета и сохранение ссылки для удаления не стоит.