Qt GUIで三角形を描画:QPainter::drawPolygon()徹底解説


QPainter::drawPolygon() 関数は、Qt GUIアプリケーションでポリゴンを描画するために使用されます。ポリゴンとは、一連の点で接続された閉じた形状です。この関数は、ペイントデバイス上にポリゴンの輪郭を描画します。

構文

void QPainter::drawPolygon(const QPolygonF& polygon);
void QPainter::drawPolygon(const QPolygon& polygon);

パラメータ

  • polygon: 描画するポリゴンを表す QPolygonF または QPolygon オブジェクトです。

機能

この関数は、指定されたポリゴンの輪郭を現在のペンスタイル、ペン幅、および塗りつぶしの設定を使用して描画します。ポリゴンが塗りつぶされている場合は、現在のブラシを使用して塗りつぶされます。

次のコードは、赤い三角形を描画します。

QPainter painter(widget);
painter.setPen(Qt::red);
painter.setBrush(Qt::red);

QPolygonF polygon;
polygon << QPointF(50, 100) << QPointF(150, 200) << QPointF(100, 300);

painter.drawPolygon(polygon);
  • QPainter::drawConvexPolygon() 関数は、凸ポリゴン (自己交差していないポリゴン) をより効率的に描画するために使用できます。
  • ポリゴンが退化している場合 (つまり、点が 3 つ未満の場合)、関数は何も描画しません。
  • ポリゴンが自己交差している場合、結果は予測できません。


例 1: 単色三角形

#include <QApplication>
#include <QPainter>
#include <QWidget>

class MyWidget : public QWidget {
public:
    MyWidget() {
        setFixedSize(200, 200);
    }

protected:
    void paintEvent(QPaintEvent *event) override {
        QPainter painter(this);

        painter.setPen(Qt::red);
        painter.setBrush(Qt::red);

        QPolygonF polygon;
        polygon << QPointF(50, 100) << QPointF(150, 200) << QPointF(100, 300);

        painter.drawPolygon(polygon);
    }
};

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

    MyWidget widget;
    widget.show();

    return app.exec();
}

このコードは、赤い三角形を描画するウィジェットを作成します。

例 2: グラデーション三角形

#include <QApplication>
#include <QGradient>
#include <QPainter>
#include <QWidget>

class MyWidget : public QWidget {
public:
    MyWidget() {
        setFixedSize(200, 200);
    }

protected:
    void paintEvent(QPaintEvent *event) override {
        QPainter painter(this);

        QLinearGradient gradient(0, 0, 200, 200);
        gradient.setColorAt(0, Qt::red);
        gradient.setColorAt(1, Qt::yellow);

        painter.setPen(Qt::black);
        painter.setBrush(gradient);

        QPolygonF polygon;
        polygon << QPointF(50, 100) << QPointF(150, 200) << QPointF(100, 300);

        painter.drawPolygon(polygon);
    }
};

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

    MyWidget widget;
    widget.show();

    return app.exec();
}

このコードは、グラデーションで塗りつぶされた三角形を描画するウィジェットを作成します。

例 3: 画像付き三角形

#include <QApplication>
#include <QImage>
#include <QPainter>
#include <QWidget>

class MyWidget : public QWidget {
public:
    MyWidget() {
        setFixedSize(200, 200);

        image.load("image.png");
    }

protected:
    void paintEvent(QPaintEvent *event) override {
        QPainter painter(this);

        painter.setPen(Qt::black);

        QPolygonF polygon;
        polygon << QPointF(50, 100) << QPointF(150, 200) << QPointF(100, 300);

        painter.drawPolygon(polygon);

        painter.setOpacity(0.5);
        painter.drawImage(polygon.boundingRect(), image);
    }

private:
    QImage image;
};

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

    MyWidget widget;
    widget.show();

    return app.exec();
}

このコードは、画像でテクスチャされた三角形を描画するウィジェットを作成します。

#include <QApplication>
#include <QPainter>
#include <QWidget>

class MyWidget : public QWidget {
public:
    MyWidget() {
        setFixedSize(200, 200);
    }

protected:
    void paintEvent(QPaintEvent *event) override {
        QPainter painter(this);

        painter.setPen(Qt::black);
        painter.setBrush(Qt::yellow);

        QPolygonF polygon;
        for (int i = 0; i < 5; ++i) {
            double angle = i * 2 * M_PI / 5;
            double radius = 100;
            QPointF point(radius * cos(angle), radius * sin


QPainter::drawPath()`

利点

  • ベジェ曲線などの複雑な形状を描画できる
  • より柔軟な描画機能

欠点

  • QPainter::drawPolygon() よりも複雑


QPainter painter(widget);
painter.setPen(Qt::red);
painter.setBrush(Qt::red);

QPainterPath path;
path.moveTo(50, 100);
path.lineTo(150, 200);
path.lineTo(100, 300);
path.close();

painter.drawPath(path);

QGLWidget::drawPolygon()`

QGLWidget::drawPolygon() 関数は、OpenGL を使用してポリゴンを描画します。これは、パフォーマンスが重要な場合や、3D グラフィックスと組み合わせる必要がある場合に役立ちます。

利点

  • 3D グラフィックスと組み合わせられる
  • 高速な描画

欠点

  • QPainter::drawPolygon() よりも複雑
  • OpenGL の知識が必要


void MyGLWidget::initializeGL() {
    // OpenGL を初期化
}

void MyGLWidget::paintGL() {
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
    glBegin(GL_POLYGON);
        glVertex2f(50, 100);
        glVertex2f(150, 200);
        glVertex2f(100, 300);
    glEnd();
}

カスタム描画関数

独自の描画関数を作成することもできます。これは、特定のニーズに合わせた高度な制御が必要な場合に役立ちます。

利点

  • 高度な制御が可能
  • 独自の描画ロジックを実装できる

欠点

  • 複雑になる可能性がある
  • 時間と労力が必要


void drawTriangle(QPainter& painter, const QPointF& p1, const QPointF& p2, const QPointF& p3) {
    painter.setPen(Qt::black);
    painter.setBrush(Qt::red);

    painter.beginPolygon();
        painter.drawPoint(p1);
        painter.drawPoint(p2);
        painter.drawPoint(p3);
    painter.endPolygon();
}

サードパーティのライブラリ

Qt には、ポリゴン描画機能を拡張するサードパーティのライブラリがいくつかあります。これらのライブラリは、特定のニーズに特化した追加機能を提供する場合があります。

利点

  • 特定のニーズに特化した機能を提供する場合がある
  • 既存の機能を拡張できる

欠点

  • Qt と互換性がない場合がある
  • ライブラリのインストールと学習が必要