2012-12-07 2 views
1

Я пишу средство просмотра изображений с Qt на основе QGraphicsScene функции Qt. Я создаю модель каждого изображения в классе ImageModel и управляю отображением изображения в классе ImageView. Класс ImageView выглядит следующим образом (только ту часть, которая интересна):Управление памятью для переменной члена класса в Qt

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 выполнять управление памятью, установив мое основное окно в качестве родительского элемента представления и сцены или я должен сам позаботиться о управлении памятью (оставьте представление и сцену без родителей и удалите их в классе деструкторов)? Какая хорошая стратегия в этом случае?

ответ

0

Если вы хотите, чтобы представление было вложено внутри главного окна, вы должны иметь, чтобы сделать его ребенком.

Для вашего общего вопроса это действительно сводится к желаемым срокам жизни объекта и семантике собственности. Если вы не хотите, чтобы представление/сцена перешли в главное окно, тогда да, они должны быть детьми. У вас есть возможность удалить их с помощью других средств в более раннее время.

+0

Это правильно, я должен сделать вид ребенка в главном окне. Спасибо за ответ. – Cristi

0

Если вы им больше не нужны, у вас есть причина держать их на всю жизнь родителя? Если нет, я не понимаю, почему вы хотите сохранить выделенную память.

Если вам больше не нужен ресурс, вы должны освободить его, если у вас нет причин. Обратите внимание, что вы можете удалить их независимо от того, имеют ли они родителя или нет; когда вы удаляете объект с родителем, он удаляется из списка дочерних элементов родителя.

0

Позвольте Qt заботиться об удалении. Это удобно и безопасно. Не держите ссылки, которые вам не нужны. Например, добавление макета и сохранение ссылки только для удаления не стоит.