删除和释放QGraphicsItem类派生对象

时间:2015-07-10 06:43:28

标签: c++ qt qt5 qgraphicsitem qgraphicsscene

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

class StairCurve : public QObject, public CurveShape, public QGraphicsItem

class BezierCurve: public QObject, public CurveShape, public QGraphicsItem

CurveShape是一个类,它有一些与这些曲线相关的常见属性,如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];将返回指向我对象的基类部分的指针。所以调用删除它对我来说很好。此对象不再是场景的一部分。

我担心在delete上调用item会调用基类上的析构函数,对吧?我不认为它会从记忆中删除整个对象。做这样的事情会更有意义:

delete dynamic_cast<BezierCurve*>(item);

更正式,

Class A : public B, public C
Class B : public D

A *a;

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

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

1 个答案:

答案 0 :(得分:2)

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