对象的所有权 - 哪个小部件应该删除它?

时间:2016-07-08 18:25:15

标签: c++ qt pointers qwidget ownership

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

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

Widget:包含gui元素,用于对QGraphicsScene* m_scene(派生类)及其项目进行更改。
MainWidget:包含放置Widget的scrollArea,包含QGraphicsView的scrollArea和工具箱。 (它被设计为可以由不同的小部件重用)

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的一部分)

2 个答案:

答案 0 :(得分:1)

指针的所有者是应该执行删除的那个。您已确定Widget是所有者,因此它应该删除该资源。

Widget使用m_canvas(其中contentWidget->getCanvas()类型为contentWidget)初始化Widget以来Widget是所有者似乎是合理的,这导致我假设new也是调用dag_concurrency = 9999 max_active_runs_per_dag = 9999 parallellism = 9999 celeryd_concurrency = 4 运算符的人。

答案 1 :(得分:0)

您的canvas类似乎继承自QGraphicsScene,继承自QObject。只要它有父母,就不需要删除;父对象处理这个。

无论哪个类MyCanvas对象的父级都应该使用QPointer存储指针以防止悬空指针。