Pynote

Python、機械学習、画像処理について

QGraphicsView を使う

QGraphicsView、QGraphicsScene、QGraphicsItem

QGraphicsScene はキャンパス、QGraphicsView はキャンパスを飾る額縁にあたる。
QGraphicsScene に描写する対象物 QGraphicsItem を追加する形でシーンを構成する。

f:id:nekobean:20170909031440p:plain

使い方

1. QGraphicsView の作成

Qt Desiner 上でウィジェットボックスにある Graphics View をフォームにドラッグアンドドロップする。

f:id:nekobean:20170909031458p:plain

2. QGraphicsScene の作成
private:
    QGraphicsScene scene_;
3. QGraphicsItem の作成

QGraphicsItem は、既存のものでは丸や線などの図形や画像などが用意されており、それぞれサブクラスになっている。
まず画像を表す QGraphicsPixmapItem を作成する。

QImage image("E:/sample.jpg");

// QGraphicsPixmapItem を作成する。
QGraphicsPixmapItem *image_item = new QGraphicsPixmapItem(QPixmap::fromImage(image));

次に長方形を表す QGraphicsRectItem を作成してみる。

QGraphicsRectItem *rect_item = new QGraphicsRectItem(50, 50, 100, 100);
4. QGraphicsRectItem を QGraphicsScene に追加する

先程作成した2つのアイテムを QGraphicsScene に追加する。

f:id:nekobean:20170909031822p:plain

このとき、ポインタの所有権は QGraphicsScene に移るため、こちら側でポインタを解放してはならない。

scene_.addItem(image_item);
scene_.addItem(rect_item);

そのため、明示的に delete しなくても、以下のようにメンバ変数にした QGraphicsRectItem を渡すこともNGなので注意する。

ヘッダーファイル

private:
    QGraphicsRectItem item;

ソースファイル

scene_.addItem(&item);

所有権を取り戻すには、追加した QGraphicsRectItem を QGraphicsScene から削除する。

scene_.removeItem(item)
5. QGraphicsScene を QGraphicsView に設定する

最後に作成したシーンを QGraphicsView による描写対象に設定する。
複数シーンを作成し、切り替えたりすることも可能である。

f:id:nekobean:20170909031526p:plain

ui->graphicsView->setScene(&scene_);