删除和释放QGraphicsItem类派生对象

Deleting and freeing QGraphicsItem class derived objects

本文关键字:派生 对象 QGraphicsItem 释放 删除      更新时间:2023-10-16

我已经从QGraphicsItem类派生和绘制一些自定义形状。然后将这些多个形状添加到QGraphicsScene中。

class StairCurve : public QObject, public CurveShape, public QGraphicsItem
class BezierCurve: public QObject, public CurveShape, public QGraphicsItem

CurveShape类具有与这些曲线相关的一些常见性质,如ID等。它不是从别的东西推导出来的。它有一些pure virtual功能。

为了从场景中删除所有的bezier,我正在做这样的事情:

        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];将返回指向对象基类部分的指针。所以对我来说,删除它看起来很好。此对象将不再是场景的一部分。

我担心的是在item上调用delete将调用基类上的析构函数,对吗?我不认为它会把整个物体从记忆中移除。这样做会更有意义吗?

delete dynamic_cast<BezierCurve*>(item);

更正式,

Class A : public B, public C
Class B : public D
A *a;

要删除对象a,正确的方法是在a上使用delete操作符,而不是在层次结构中的任何基类对象上,正确吗?

virtual destructors的使用是否以任何方式与所有这些有关?

QGraphicsItem有虚析构函数。因此,如果调用delete item;,其中itemQGraphicsItem类型的指针,则首先调用所有派生类的析构函数。要测试这一点,只需实现StairCurve类的析构函数,看看它是否被调用。