我正在使用基于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);
}
在我推导QMainWindow的过程中,我也有指向ImageView的指针。
我的问题是:我应该让Qt通过将我的主窗口设置为视图和场景的父窗口来进行内存管理,还是应该自己处理内存管理(离开视图和没有父项的场景并删除它们)在类析构函数中)?在这种情况下,什么是好策略?
答案 0 :(得分:0)
如果您不再需要它们,您是否有理由在父母的整个生命周期内保留它们?如果没有,我不明白你为什么要保留分配的内存。
如果你不再需要资源,你应该释放它,除非你有理由不这样做。请注意,您可以删除它们,无论它们是否有父母;当您删除具有父项的对象时,它会从父项的子项列表中删除它。
答案 1 :(得分:0)
如果您希望视图嵌套在主窗口中,那么您将 使其成为一个孩子。
对于您的一般问题,这实际上归结为您期望的对象生命周期和所有权语义。如果你不希望视图/场景比主窗口寿命更长那么它们应该是孩子们。您仍然可以选择在较早时间通过其他方式删除它们。
答案 2 :(得分:0)
让Qt负责删除。它方便又安全。不要在你不需要的地方附上参考。例如,添加布局并保留仅用于删除的引用是不值得的。