例 1: 単純な多角形アイテムの削除


QGraphicsPolygonItem::~QGraphicsPolygonItem() は、QGraphicsPolygonItem クラスのデストラクタです。これは、QGraphicsPolygonItem オブジェクトが破棄されるときに自動的に呼び出される特殊なメンバ関数です。デストラクタの役割は、オブジェクトが解放する前に必要なクリーンアップ作業を実行することです。

機能

QGraphicsPolygonItem::~QGraphicsPolygonItem() は、以下の処理を行います。

  1. シーンからの削除
    オブジェクトを QGraphicsScene から削除します。これにより、シーン内の他のアイテムとの依存関係が解除されます。
  2. 親への通知
    オブジェクトが親アイテムを持っている場合、その親に itemDestroyed() シグナルが送信されます。

重要事項

QGraphicsPolygonItem::~QGraphicsPolygonItem() は、明示的に呼び出す必要はありません。オブジェクトがスコープから外れたときに自動的に呼び出されます。

QGraphicsPolygonItem* item = new QGraphicsPolygonItem(polygon);
scene->addItem(item);

// ...

// オブジェクトが不要になったとき

delete item;

上記のコードでは、item オブジェクトがスコープから外れるときに、QGraphicsPolygonItem::~QGraphicsPolygonItem() が自動的に呼び出され、オブジェクトが解放されます。

  • オブジェクトを削除すると、そのオブジェクトに関連するすべてのデータが失われます。
  • QGraphicsPolygonItem オブジェクトを削除する前に、そのオブジェクトに依存している他のオブジェクトがないことを確認する必要があります。


例 1: 単純な多角形アイテムの削除

この例では、五角形を描画する QGraphicsPolygonItem オブジェクトを作成し、シーンに追加します。その後、オブジェクトを削除してリソースを解放します。

#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsPolygonItem>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // シーンの作成
    QGraphicsScene scene;

    // 五角形の作成
    QPolygon polygon;
    polygon << QPoint(0, 50)
             << QPoint(50, 100)
             << QPoint(100, 50)
             << QPoint(75, 0)
             << QPoint(25, 0);
    QGraphicsPolygonItem* item = new QGraphicsPolygonItem(polygon);

    // シーンへのアイテムの追加
    scene.addItem(item);

    // ビューの作成
    QGraphicsView view(&scene);
    view.resize(400, 300);
    view.show();

    // オブジェクトの削除 (シーン内のアイテムが自動的に削除されます)
    delete item;

    return app.exec();
}

例 2: 親アイテムとの依存関係

この例では、QGraphicsPolygonItem オブジェクトを QGraphicsItemGroup に追加し、グループをシーンに追加します。その後、グループを削除して、グループ内のすべてのアイテムを解放します。

#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsPolygonItem>
#include <QGraphicsItemGroup>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // シーンの作成
    QGraphicsScene scene;

    // 五角形の作成
    QPolygon polygon;
    polygon << QPoint(0, 50)
             << QPoint(50, 100)
             << QPoint(100, 50)
             << QPoint(75, 0)
             << QPoint(25, 0);
    QGraphicsPolygonItem* item1 = new QGraphicsPolygonItem(polygon);

    // 三角形の作成
    QPolygon triangle;
    triangle << QPoint(0, 0)
              << QPoint(50, 50)
              << QPoint(100, 0);
    QGraphicsPolygonItem* item2 = new QGraphicsPolygonItem(triangle);

    // グループの作成
    QGraphicsItemGroup* group = new QGraphicsItemGroup();
    group->addToGroup(item1);
    group->addToGroup(item2);

    // シーンへのグループの追加
    scene.addItem(group);

    // ビューの作成
    QGraphicsView view(&scene);
    view.resize(400, 300);
    view.show();

    // グループの削除 (グループ内のアイテムが自動的に削除されます)
    delete group;

    return app.exec();
}
  • オブジェクトを削除すると、そのオブジェクトに関連するすべてのデータが失われます。
  • オブジェクトを削除する前に、そのオブジェクトに依存している他のオブジェクトがないことを確認する必要があります。
  • 上記の例では、QGraphicsPolygonItem::~QGraphicsPolygonItem() が明示的に呼び出されていません。オブジェクトがスコープから外れるときに自動的に呼び出されます。


代替方法

  • QGraphicsItem::setParentItem(nullptr) メソッドを使用する
    setParentItem(nullptr) メソッドは、オブジェクトの親アイテムを nullptr に設定します。これにより、オブジェクトが親アイテムから切り離され、親アイテムがオブジェクトを削除するようになります。
  • QGraphicsItem::removeItem() メソッドを使用する
    removeItem() メソッドは、QGraphicsScene または QGraphicsItemGroup からオブジェクトを直接削除します。これは、オブジェクトがシーン内に存在する必要がある場合に役立ちます。
  • deleteLater() メソッドを使用する
    deleteLater() メソッドは、オブジェクトをイベントループの次のイベント処理時に削除するようにスケジュールします。これは、オブジェクトがまだ使用されている可能性がある場合に役立ちます。

// deleteLater() メソッドを使用する
QGraphicsPolygonItem* item = new QGraphicsPolygonItem(polygon);
scene->addItem(item);

// ...

QTimer::singleShot(1000, item, SLOT(deleteLater()));
// QGraphicsItem::removeItem() メソッドを使用する
QGraphicsPolygonItem* item = new QGraphicsPolygonItem(polygon);
scene->addItem(item);

// ...

scene->removeItem(item);
// QGraphicsItem::setParentItem(nullptr) メソッドを使用する
QGraphicsPolygonItem* item = new QGraphicsPolygonItem(polygon);
QGraphicsItemGroup* group = new QGraphicsItemGroup();
group->addToGroup(item);
scene->addItem(group);

// ...

item->setParentItem(nullptr);
  • オブジェクトを削除すると、そのオブジェクトに関連するすべてのデータが失われます。
  • オブジェクトを削除する前に、そのオブジェクトに依存している他のオブジェクトがないことを確認する必要があります。
  • 上記の代替方法は、QGraphicsPolygonItem::~QGraphicsPolygonItem() と同じ動作を保証するわけではありません。