Qtで多角形描画をもっと自由に!QGraphicsPolygonItemの代替方法完全ガイド


QGraphicsPolygonItem は、Qt Widgetsライブラリで提供される2Dグラフィックスアイテムの一つであり、多角形を描画するために使用されます。QGraphicsPolygonItem::QGraphicsPolygonItem() コンストラクタは、新しい QGraphicsPolygonItem オブジェクトを作成するために使用されます。

コンストラクタの引数

このコンストラクタには、以下の引数が存在します。

  • parent: 親アイテムを指定するための QGraphicsItem オブジェクト。デフォルトでは、親アイテムは設定されません。
  • polygon: 描画する多角形を定義する QPolygonF オブジェクト。デフォルトでは、空の多角形が設定されます。

コンストラクタの動作

このコンストラクタは、以下の処理を実行します。

  1. 指定された polygon を使用して、新しい QGraphicsPolygonItem オブジェクトを作成します。
  2. オブジェクトを parent アイテムの子アイテムとして追加します。
  3. オブジェクトの初期化を行います。

QPolygonF polygon;
polygon << QPointF(0, 0);
polygon << QPointF(100, 0);
polygon << QPointF(100, 100);
polygon << QPointF(0, 100);

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

このコードは、以下のような矩形を描画する QGraphicsPolygonItem オブジェクトを作成します。

  • オブジェクトは、QGraphicsScene に追加することで、シーンに表示することができます。
  • オブジェクトの位置とサイズは、setPos()setScale() メソッドを使用して設定することができます。
  • QGraphicsPolygonItem オブジェクトは、QPenQBrush オブジェクトを使用して、線のスタイルと塗りつぶしのスタイルを設定することができます。


例1:三角形を描画する

#include <QtWidgets>

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

  QGraphicsScene scene;
  QGraphicsView view(&scene);

  QPolygonF polygon;
  polygon << QPointF(0, 0);
  polygon << QPointF(100, 0);
  polygon << QPointF(50, 100);

  QGraphicsPolygonItem *item = new QGraphicsPolygonItem(polygon);
  scene.addItem(item);

  view.show();
  return app.exec();
}

このコードは、以下のような三角形を描画します。

例2:星形を描画する

#include <QtWidgets>

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

  QGraphicsScene scene;
  QGraphicsView view(&scene);

  QPolygonF polygon;
  for (int i = 0; i < 5; ++i) {
    polygon << QPointF(50 + 40 * cos(2 * M_PI * i / 5),
                      50 + 40 * sin(2 * M_PI * i / 5));
  }

  QGraphicsPolygonItem *item = new QGraphicsPolygonItem(polygon);
  scene.addItem(item);

  view.show();
  return app.exec();
}
#include <QtWidgets>

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

  QGraphicsScene scene;
  QGraphicsView view(&scene);

  QPolygonF polygon;
  polygon << QPointF(0, 0);
  polygon << QPointF(50, 30);
  polygon << QPointF(100, 0);
  polygon << QPointF(70, 50);
  polygon << QPointF(30, 50);

  QGraphicsPolygonItem *item = new QGraphicsPolygonItem(polygon);
  scene.addItem(item);

  view.show();
  return app.exec();
}


QPainter を使用する

QPainter クラスを使用して、直接的に多角形を描画することができます。この方法は、QGraphicsPolygonItem を使用するよりも柔軟性が高いですが、コード量が多くなるという欠点があります。

QPainter painter(&scene);
painter.setPen(QPen(Qt::black));
painter.setBrush(Qt::red);

QPolygonF polygon;
polygon << QPointF(0, 0);
polygon << QPointF(100, 0);
polygon << QPointF(100, 100);
polygon << QPointF(0, 100);

painter.drawPolygon(polygon);

QPath を使用する

QPath クラスを使用して、多角形を定義し、それを描画することができます。この方法は、QGraphicsPolygonItem を使用するよりもコード量が多くなりますが、より複雑な形状を描画することができます。

QPath path;
path.moveTo(0, 0);
path.lineTo(100, 0);
path.lineTo(100, 100);
path.lineTo(0, 100);
path.close();

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

カスタムアイテムを作成する

独自の描画ロジックを持つカスタムアイテムを作成することができます。この方法は、最も柔軟性が高いですが、最も複雑な方法でもあります。

class MyPolygonItem : public QGraphicsItem {
public:
  MyPolygonItem(const QPolygonF &polygon) : polygon(polygon) {}

protected:
  void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override {
    painter->setPen(QPen(Qt::black));
    painter->setBrush(Qt::red);
    painter.drawPolygon(polygon);
  }

private:
  QPolygonF polygon;
};

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

それぞれの方法の利点と欠点を比較した表

方法利点欠点
QPainter を使用する柔軟性が高いコード量が多い
QPath を使用するより複雑な形状を描画できるコード量が多い
カスタムアイテムを作成する最も柔軟性が高い最も複雑な方法

QGraphicsPolygonItem::QGraphicsPolygonItem() コンストラクタは、シンプルな多角形を描画する場合に適していますが、より複雑な形状を描画する場合や、より柔軟な制御が必要な場合は、代替方法の方が適している場合があります。