删除和释放 QGraphicsItem class 个派生对象
Deleting and freeing QGraphicsItem class derived objects
我从 QGraphicsItem
class 派生并绘制了一些自定义形状。然后将这些多个形状添加到 QGraphicsScene
.
class StairCurve : public QObject, public CurveShape, public QGraphicsItem
class BezierCurve: public QObject, public CurveShape, public QGraphicsItem
CurveShape
是一个 class,它有一些与这些曲线相关的共同属性,如 ID 等。它不从其他任何东西派生。不过它有一些 pure virtual
功能。
为了从场景中删除所有贝塞尔曲线,我正在做这样的事情:
QList<QGraphicsItem*> all = selectedItems();
for (int i = 0; i < all.size(); i++)
{
QGraphicsItem * item = all[i];
if( NULL != item && (BezierCurve::Type == item->type()) )
{
removeItem(item);
delete item;
item = NULL;
}
}
QGraphicsItem * item = all[i];
将 return 指向我的对象的基础 class 部分的指针。所以调用 remove 对我来说看起来不错。此对象将不再是场景的一部分。
我担心的是,在 item
上调用 delete
会调用基础 class 上的析构函数,对吗?我不认为它会从内存中删除完整的对象。做这样的事情会更有意义吗:
delete dynamic_cast<BezierCurve*>(item);
更正式地说,
Class A : public B, public C
Class B : public D
A *a;
要删除对象 a
,正确的方法是在 a
上使用 delete
运算符,而不是在层次结构中的任何基础 class 对象上,正确的 ?
virtual destructors
的使用是否与这一切有任何关系?
QGraphicsItem
有一个 virtual destructor。因此,如果你调用 delete item;
,其中 item
是类型 QGraphicsItem
的指针,所有派生的 classes 的析构函数将首先被调用。要测试这一点,只需实现 StairCurve
class 的析构函数并查看它是否被调用。
我从 QGraphicsItem
class 派生并绘制了一些自定义形状。然后将这些多个形状添加到 QGraphicsScene
.
class StairCurve : public QObject, public CurveShape, public QGraphicsItem
class BezierCurve: public QObject, public CurveShape, public QGraphicsItem
CurveShape
是一个 class,它有一些与这些曲线相关的共同属性,如 ID 等。它不从其他任何东西派生。不过它有一些 pure virtual
功能。
为了从场景中删除所有贝塞尔曲线,我正在做这样的事情:
QList<QGraphicsItem*> all = selectedItems();
for (int i = 0; i < all.size(); i++)
{
QGraphicsItem * item = all[i];
if( NULL != item && (BezierCurve::Type == item->type()) )
{
removeItem(item);
delete item;
item = NULL;
}
}
QGraphicsItem * item = all[i];
将 return 指向我的对象的基础 class 部分的指针。所以调用 remove 对我来说看起来不错。此对象将不再是场景的一部分。
我担心的是,在 item
上调用 delete
会调用基础 class 上的析构函数,对吗?我不认为它会从内存中删除完整的对象。做这样的事情会更有意义吗:
delete dynamic_cast<BezierCurve*>(item);
更正式地说,
Class A : public B, public C
Class B : public D
A *a;
要删除对象 a
,正确的方法是在 a
上使用 delete
运算符,而不是在层次结构中的任何基础 class 对象上,正确的 ?
virtual destructors
的使用是否与这一切有任何关系?
QGraphicsItem
有一个 virtual destructor。因此,如果你调用 delete item;
,其中 item
是类型 QGraphicsItem
的指针,所有派生的 classes 的析构函数将首先被调用。要测试这一点,只需实现 StairCurve
class 的析构函数并查看它是否被调用。