Pynote

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

Qt - QGraphicsScene - アイテムの追加

概要

Qt の QGraphicsScene でアイテムを追加する方法について

試した環境

シーンへのアイテムの追加

addItem()

QAbstractGraphisItem クラスを継承したクラスをシーンに追加するには addItem() を使用する。

addItem(QGraphicsItem *item)

サンプルコード

// QGraphicsPixmapItem を作成する。
QPixmap pixmap = QPixmap::fromImage(QImage(":/qt.png"));
QGraphicsPixmapItem *item = new QGraphicsPixmapItem(pixmap);
// シーンに追加する。
scene_->addPixmap(item);

QAbstractGraphisItem が別のシーンに追加済みの場合は、先にそのシーンから削除された後にこのシーンに追加する。
ポインタの所有権は QGraphicsScene に移るため、デストラクタ実行時に自動で delete される。
そのため、delete を明示的に呼んだり、メンバ変数のポインタを渡したりすると、double free になるため注意する。
所有権を戻すには、removeItem() でシーンから削除する。

便利関数

デフォルトで用意されている長方形や画像などのアイテムを追加するための関数が用意されている。

// (1) 長方形を追加
QGraphicsEllipseItem *addEllipse(
    const QRectF &rect,
    const QPen &pen = QPen(), const QBrush &brush = QBrush())
// (2) 長方形を追加
QGraphicsEllipseItem *addEllipse(
    qreal x, qreal y, qreal w, qreal h,
    const QPen &pen = QPen(), const QBrush &brush = QBrush())
// (3) 線を追加
QGraphicsLineItem *addLine(
    const QLineF &line,
    const QPen &pen = QPen())
// (4) 線を追加
QGraphicsLineItem *addLine(
    qreal x1, qreal y1, qreal x2, qreal y2,
    const QPen &pen = QPen())
// (5) QPainterPath を追加
QGraphicsPathItem *addPath(
    const QPainterPath &path,
    const QPen &pen = QPen(), const QBrush &brush = QBrush())
// (6) 画像 を追加
QGraphicsPixmapItem *addPixmap(const QPixmap &pixmap)
// (7) ポリゴンを追加
QGraphicsPolygonItem *addPolygon(
    const QPolygonF &polygon,
    const QPen &pen = QPen(), const QBrush &brush = QBrush())
// (8) 長方形を追加
QGraphicsRectItem *addRect(
    const QRectF &rect,
    const QPen &pen = QPen(), const QBrush &brush = QBrush())
// (9) 長方形を追加
QGraphicsRectItem *addRect(
    qreal x, qreal y, qreal w, qreal h,
    const QPen &pen = QPen(), const QBrush &brush = QBrush())
// (10) テキストを追加
QGraphicsSimpleTextItem *addSimpleText(
    const QString &text,
    const QFont &font = QFont())
// (11) テキストを追加
QGraphicsTextItem *addText(
    const QString &text,
    const QFont &font = QFont())
// (12) ウィジェットを追加
QGraphicsProxyWidget *addWidget(
    QWidget *widget,
    Qt::WindowFlags wFlags = Qt::WindowFlags())

これらの関数は返り値としてシーンに追加されたアイテムのポインタを返すようになっているため、あとで大きさを変えるためにアイテムにアクセスする場合などに使用する。

サンプルコード

// QGraphicsScene を作成する。
scene_ = new QGraphicsScene();

// 楕円をシーンに追加する。 (QGraphicsEllipseItem)
scene_->addEllipse(QRectF(100, 100, 500, 100));
// 線をシーンに追加する。 (QGraphicsLineItem)
scene_->addLine(QLineF(0, 0, 100, 100));
// 画像をシーンに追加する。 (QGraphicsPixmapItem)
QPixmap pixmap = QPixmap::fromImage(QImage(":/qt.png"));
scene_->addPixmap(pixmap);
// ポリゴンをシーンに追加する。 (QGraphicsPolygonItem)
QPolygonF polygon;
polygon << QPointF(200, 200) << QPointF(300, 200) << QPointF(250, 300);
scene_->addPolygon(polygon);
// 長方形をシーンに追加する。 (QGraphicsRectItem)
scene_->addRect(QRectF(50, 50, 100, 100));
// テキストをシーンに追加する。 (QGraphicsSimpleTextItem)
scene_->addSimpleText("Hello World");
// テキストをシーンに追加する。 (QGraphicsTextItem)
scene_->addText("Hello World");

// QGraphicsView にシーンを設定する。
ui->graphicsView->setScene(scene_);

f:id:nekobean:20171029162118p:plain