Qt GUI プログラミング: 矩形描画の基礎から応用まで、QPainterPath::addRect() をマスターしよう


QPainterPath::addRect() は、Qt GUIにおける描画操作において、矩形形状をパスに追加するための関数です。パスは、描画処理を効率的に行うために使用される図形データ構造です。

関数詳細

QPainterPath::addRect() には、2つのオーバーロードされた関数があります。

  1. QRectF を引数とする場合
void QPainterPath::addRect(const QRectF &rectangle);

この関数は、QRectF オブジェクトで指定された矩形をパスに追加します。QRectF は、浮動小数点座標を使用して矩形を定義するクラスです。

  1. 個別の座標とサイズを引数とする場合
void QPainterPath::addRect(qreal x, qreal y, qreal width, qreal height);

この関数は、xy 座標と、widthheight サイズを使用して矩形を定義し、それをパスに追加します。

QPainterPath path;

// 矩形をパスに追加
path.addRect(20, 30, 50, 40);

// ペインタを使用して矩形を描画
QPainter painter(&widget);
painter.setPen(Qt::black);
painter.drawPath(path);

この例では、QPainterPath オブジェクトを作成し、addRect() 関数を使用して矩形をパスに追加します。その後、QPainter オブジェクトを使用して矩形を描画します。

  • 複数の矩形をパスに追加するには、QPainterPath::moveTo() 関数を使用して新しいサブパスを開始してから、addRect() 関数を使用して各矩形を追加します。
  • 矩形の角を丸くするには、QPainterPath::addRoundedRect() 関数を使用できます。
  • QPainterPath::addRect() 関数は、閉じたサブパスとして矩形を追加します。つまり、矩形のすべての辺が自動的に接続されます。

上記以外にも、QPainterPath クラスには様々な機能が用意されています。詳細については、Qt ドキュメントを参照してください。



#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>
#include <QtGui/QPainterPath>
#include <QtGui/QPainter>

class ExampleWidget : public QWidget
{
public:
    ExampleWidget()
    {
        init();
    }

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

        // パスを作成
        QPainterPath path;

        // 矩形をパスに追加
        path.addRect(20, 30, 50, 40);
        path.addRect(80, 60, 70, 50);
        path.addRect(160, 90, 60, 80);

        // ペインタを使用して矩形を描画
        painter.setPen(Qt::black);
        painter.drawPath(path);

        // 各矩形を異なる色で塗りつぶす
        painter.setBrush(Qt::red);
        painter.drawRect(20, 30, 50, 40);

        painter.setBrush(Qt::green);
        painter.drawRect(80, 60, 70, 50);

        painter.setBrush(Qt::blue);
        painter.drawRect(160, 90, 60, 80);
    }

private:
    void init()
    {
        setFixedSize(250, 200);
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    ExampleWidget widget;
    widget.show();

    return app.exec();
}

例2: 塗りつぶされた矩形を描画

この例では、QPainterPath::addRect() 関数を使用して矩形をパスに追加し、それを塗りつぶします。

#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>
#include <QtGui/QPainterPath>
#include <QtGui/QPainter>

class ExampleWidget : public QWidget
{
public:
    ExampleWidget()
    {
        init();
    }

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

        // パスを作成
        QPainterPath path;

        // 矩形をパスに追加
        path.addRect(20, 30, 50, 40);

        // ペインタを使用して矩形を描画
        painter.setBrush(Qt::red);
        painter.fillPath(path);
    }

private:
    void init()
    {
        setFixedSize(100, 80);
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    ExampleWidget widget;
    widget.show();

    return app.exec();
}

例3: 枠線付きの矩形を描画

この例では、QPainterPath::addRect() 関数を使用して矩形をパスに追加し、枠線を描画します。

#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>
#include <QtGui/QPainterPath>
#include <QtGui/QPainter>

class ExampleWidget : public QWidget
{
public:
    ExampleWidget()
    {
        init();
    }

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

        // パスを作成
        QPainterPath path;

        // 矩形をパスに追加
        path.addRect(20, 30, 50, 40);

        // ペインタを使用して矩形を描画
        painter.setPen(Qt::black);
        painter.drawPath(path);
    }

private:
    void init()
    {
        setFixedSize(100, 80);
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    ExampleWidget widget;
    widget.show();

    return


代替方法

  1. QPainter::drawRect()

    QPainter::drawRect() 関数は、矩形を直接描画するシンプルな方法です。QPainterPath::addRect() と比較して、以下の利点があります。

    • より簡潔なコードで矩形を描画できます。
    • パスの作成と破棄にかかるオーバーヘッドがありません。

    ただし、以下の点に注意が必要です。

    • 塗りつぶしや枠線のみの描画には対応していません。
    • パス操作機能は利用できません。
    QPainter painter(this);
    painter.setPen(Qt::black);
    painter.drawRect(20, 30, 50, 40);
    
  2. QPolygonF

    QPolygonF クラスを使用して、矩形を表すポリゴンを作成し、それをパスに追加することができます。この方法は、以下の利点があります。

    • 矩形の角を丸くしたり、斜めにするなど、より柔軟な形状を作成できます。
    • パス操作機能を自由に利用できます。

    ただし、QPainterPath::addRect() と比較して、以下の点に注意が必要です。

    • コードが少し複雑になります。
    • パスの作成と破棄にかかるオーバーヘッドが少し増加します。
    QPainterPath path;
    
    QPolygonF polygon;
    polygon << QPointF(20, 30) << QPointF(70, 30) << QPointF(70, 70) << QPointF(20, 70);
    path.addPolygon(polygon);
    
    QPainter painter(this);
    painter.setPen(Qt::black);
    painter.drawPath(path);
    
  3. カスタム関数

    状況によっては、QPainterPath::addRect() の機能を拡張するカスタム関数を作成することもできます。この方法は、以下の利点があります。

    • 独自の形状や描画処理を自由に実装できます。
    • コードをより効率的に記述できます。
    • コードが複雑になり、デバッグが難しくなる可能性があります。
    • パフォーマンスを考慮する必要があります。

QPainterPath::addRect() 関数は、矩形形状をパスに追加するための汎用的な方法ですが、状況によっては代替方法の方が適切な場合があります。上記で紹介した代替方法は、それぞれ異なる利点と欠点がありますので、要件に応じて最適な方法を選択してください。

  • 描画処理の複雑さやパフォーマンス要件などを考慮して、適切な方法を選択することが重要です。