对象的所有权 - 哪个小部件应将其删除



我有一组关系复杂的小部件。其中一个必须创建一个项目,我认为必须将其存储为指针。另一个是后来创建的,用于接收指向该项(QGraphicsScene)的指针,并将其放置在视图中。

问题:在关闭时,谁(如果有的话)应该删除该项目?


Widget :包含对QGraphicsScene* m_scene(派生类)及其项进行更改的 GUI 元素。
MainWidget :包含一个放置Widget的滚动区域、一个包含QGraphicsView的滚动区域和一个工具箱。(它被设计为可由不同的小部件重用)

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget* w = new Widget();
    MainWidget m(w);
    m.show();
    return a.exec();
}
MainWindow:: MainWindow(Widget *contentWidget, QWidget *parent) : QWidget(parent),
    ui(new Ui:: MainWindow), 
    m_contentWidget(contentWidget), 
    m_canvas(contentWidget->getCanvas())
{
    ui->setupUi(this);
    ui->myView->setScene(m_canvas);
    ui->editArea->insertWidget(0, m_contentWidget);
}

两个类都有

MyCanvas *m_canvas;

所以 - 在关闭时 - 哪个小部件应该删除m_canvasWidget类,谁是所有者,还是MainWidget类,其中包含保存场景的视图?

(在Widget中删除它 - 逻辑所有者 - 使程序崩溃,我的猜测是因为MainWidget仍然需要它作为UI的一部分)

指针的所有者是应该执行删除的人。你已确定Widget是所有者,因此应删除资源。


Widget是所有者似乎是合理的,因为m_canvas是使用 contentWidget->getCanvas() 初始化的(其中 contentWidgetWidget 类型),这让我假设Widget也是调用new运算符的那个。

你的画布类似乎继承自 QGraphicsScene ,它继承自QObject 。只要有父级,就不需要删除;父对象处理此问题。

无论哪个类不是 MyCanvas 对象的父类,都应将指针与QPointer一起存储,以防止指针悬空。

最新更新