我有一组关系复杂的小部件。其中一个必须创建一个项目,我认为必须将其存储为指针。另一个是后来创建的,用于接收指向该项(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_canvas
?Widget
类,谁是所有者,还是MainWidget
类,其中包含保存场景的视图?
(在Widget
中删除它 - 逻辑所有者 - 使程序崩溃,我的猜测是因为MainWidget
仍然需要它作为UI的一部分)
指针的所有者是应该执行删除的人。你已确定Widget
是所有者,因此应删除资源。
Widget
是所有者似乎是合理的,因为m_canvas
是使用 contentWidget->getCanvas()
初始化的(其中 contentWidget
是 Widget
类型),这让我假设Widget
也是调用new
运算符的那个。
你的画布类似乎继承自 QGraphicsScene
,它继承自QObject
。只要有父级,就不需要删除;父对象处理此问题。
无论哪个类不是 MyCanvas
对象的父类,都应将指针与QPointer
一起存储,以防止指针悬空。