1

我正在使用基于 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 通过将我的主窗口设置为视图和场景的父级来进行内存管理,还是我应该自己处理内存管理(让视图和场景没有父级并在课堂上删除它们析构函数)?在这种情况下,什么是好的策略?

4

3 回答 3

0

让 Qt 负责删除。它方便又安全。不要保留不需要的参考。例如,添加布局并保留引用只是为了删除是不值得的。

于 2012-12-10T14:18:09.290 回答
0

如果你不再需要它们,你有理由让它们在父母的整个生命周期里都在身边吗?如果不是,我不明白您为什么要保留分配的内存。

如果您不再需要资源,则应该释放它,除非您有理由不这样做。请注意,无论它们是否有父级,您都可以删除它们;当您删除具有父对象的对象时,它会将自身从父对象的子列表中删除。

于 2012-12-07T15:48:12.493 回答
0

如果您希望视图嵌套在主窗口中,则必须将设为子窗口。

对于您的一般问题,这实际上归结为您想要的对象生命周期和所有权语义。如果您不想让视图/场景超过主窗口,那么是的,它们应该是孩子。您仍然可以选择在更早的时间通过其他方式删除它们。

于 2012-12-07T16:02:36.043 回答