我有一组关系复杂的小部件。其中一个必须创建一个项目,我认为必须存储为指针。另一个,稍后创建,接收指向项目的指针 - 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_canvas
? Widget
类,是所有者,还是MainWidget
类,其中包含保存场景的视图?
(在Widget
中删除它 - 逻辑所有者 - 使程序崩溃,我的猜测是因为MainWidget
仍然需要它作为ui的一部分)
答案 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
存储指针以防止悬空指针。