Pynote

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

Qt - QGraphicsScene - シーン内のアイテムの選択方法について

試した環境

シーン内のアイテムの選択

選択範囲の設定

setSelectionArea() で選択範囲を設定する。

// (1)
void setSelectionArea(
    const QPainterPath &path,
    const QTransform &deviceTransform)
// (2)
void setSelectionArea(
    const QPainterPath &path,
    Qt::ItemSelectionMode mode = Qt::IntersectsItemShape,
    const QTransform &deviceTransform = QTransform())
// (3)
void setSelectionArea(
    const QPainterPath &path,
    Qt::ItemSelectionOperation selectionOperation,
    Qt::ItemSelectionMode mode = Qt::IntersectsItemShape,
    const QTransform &deviceTransform = QTransform())
// (4) 選択範囲の取得
QPainterPath selectionArea() const

(1)
選択範囲は path 引数に QPainterPath で指定するため、長方形以外に投げ縄選択のような複雑な選択も可能である。
deviceTransform には、シーンを描写している QGraphcsView の transform() を渡す。
シーンを回転や縮小拡大して QGraphcsView に描写している際に選択範囲を合わせるためである。
QPainterPath に含まれるアイテムまたは交わるアイテムが選択される。

(2)
(1) の引数に加えて、mode 引数で選択方式を設定できる。
Qt::ContainsItemShape: アイテムが選択範囲に含まれている場合選択する
Qt::IntersectsItemShape アイテムが選択範囲に含まれているか交わっている場合選択する
Qt::ContainsItemBoundingRect アイテムの Bounding Box が選択範囲に含まれている場合選択する
Qt::IntersectsItemBoundingRect アイテムの Bounding Box が選択範囲に含まれているか交わっている場合選択する

(3)
(2) の引数に加えて、selectionOperation で選択の挙動を設定できる。
Qt::ReplaceSelection すでに選択されているアイテムの選択を解除した上で選択範囲に含まれるアイテムを選択する。
Qt::AddToSelection すでに選択されているアイテムと今回の選択範囲に含まれるアイテムを新たな選択とする。

// 選択範囲を作成する。
QRect selectionRect(0, 0, 200, 200);
QPainterPath pp;
pp.addRect(selectionRect);
アイテムを選択可能に設定

デフォルトでは、QGraphicsItem は選択できない。
選択できるようにするには、QGraphicsItem の flag で QGraphicsItem::ItemIsSelectable を有効にする。

QGraphicsEllipseItem *item1 = scene_->addEllipse(QRectF(50, 50, 100, 100));
item1->setFlag(QGraphicsItem::ItemIsSelectable); // 選択可能にする
選択されたアイテムを取得する。
// (5) 選択されているアイテムの一覧を取得
QList<QGraphicsItem*> selectedItems() const