Qt GUI: 回転・拡大縮小も自由自在! `QPainter::brushOrigin()` と `QTransform` の強力な組み合わせ


QPainter::brushOrigin() は、Qt GUI におけるペインティングクラス QPainter のメソッドであり、現在設定されているブラシの原点を取得するために使用されます。ブラシの原点は、テクスチャやグラデーションなどの特殊な塗りつぶし効果を持つ図形の描画に影響を与える座標です。

デフォルトの動作

デフォルトでは、brushOrigin() はウィジェットの背景の原点である (0, 0) を返します。つまり、ブラシのパターンがウィジェットの左上角から開始されます。

応用例

brushOrigin() は、以下の目的で使用されます。

  • グラデーションブラシの開始点を設定する: グラデーションブラシを使用する場合、brushOrigin() を設定することで、グラデーションがどこから始まるかを制御できます。例えば、グラデーションをウィジェットの左上から右下に向かって作成したい場合は、brushOrigin()(0, 0) に設定します。
  • テクスチャブラシの配置を制御する: テクスチャブラシを使用する場合、brushOrigin() を設定することで、テクスチャがどのように配置されるかを制御できます。例えば、テクスチャをウィジェット全体に敷き詰めるのではなく、特定の位置から開始したい場合は、brushOrigin() をその位置に設定します。

コード例

QPainter painter(widget);
painter.setBrush(QBrush(Qt::gray));

// ブラシの原点をウィジェットの中央に設定
painter.setBrushOrigin(widget.width() / 2, widget.height() / 2);

// 長方形を描画
painter.drawRect(0, 0, 100, 100);

このコード例では、QPainter オブジェクトを作成し、グレーのブラシを設定します。次に、brushOrigin() を使用して、ブラシの原点をウィジェットの中央に設定します。最後に、長方形を描画します。この結果、長方形はグレーのテクスチャで塗りつぶされ、テクスチャはウィジェットの中央から開始されます。

  • brushOrigin() は、QPainter::setBrushOrigin() メソッドを使用して設定できます。
  • brushOrigin() は、ブラシがタイル化されている場合にのみ影響を与えます。つまり、ブラシが単一の画像である場合は、このメソッドを使用しても効果がありません。


例 1: テクスチャブラシの配置を制御する

QPainter painter(widget);
QImage image("texture.png");
painter.setBrush(QBrush(image));

// ブラシの原点をウィジェットの右下に設定
painter.setBrushOrigin(widget.width() - image.width(), widget.height() - image.height());

// 長方形を描画
painter.drawRect(0, 0, 100, 100);

この例では、texture.png という画像ファイルをテクスチャブラシとして使用します。brushOrigin() を使用して、ブラシの原点をウィジェットの右下に設定します。この結果、長方形はテクスチャで塗りつぶされ、テクスチャはウィジェットの右下から開始されます。

例 2: グラデーションブラシの開始点を設定する

QPainter painter(widget);
QLinearGradient gradient(0, 0, widget.width(), widget.height());
gradient.setColorAt(0, Qt::red);
gradient.setColorAt(1, Qt::blue);
painter.setBrush(QBrush(gradient));

// ブラシの原点をウィジェットの左上に設定
painter.setBrushOrigin(0, 0);

// 長方形を描画
painter.drawRect(0, 0, 100, 100);

この例では、線形グラデーションブラシを作成します。グラデーションは、ウィジェットの左上から右下に向かって、赤から青へと変化します。brushOrigin() を使用して、ブラシの原点をウィジェットの左上に設定します。この結果、長方形はグラデーションで塗りつぶされ、グラデーションはウィジェットの左上から開始されます。

例 3: タイル化されたブラシの原点を設定する

QPainter painter(widget);
QImage image("tile.png");
painter.setBrush(QBrush(image));
painter.setRenderHint(QPainter::RenderHints::TileMode, QPainter::TileMode::Repeat);

// ブラシの原点をウィジェット全体に設定
painter.setBrushOrigin(0, 0);

// ウィジェット全体を塗りつぶす
painter.fillRect(widget.rect(), painter.brush());

この例では、tile.png という画像ファイルをタイル化されたブラシとして使用します。setRenderHint() メソッドを使用して、ブラシがタイル化されるように設定します。brushOrigin() を使用して、ブラシの原点をウィジェット全体に設定します。この結果、ウィジェット全体がタイル化された画像で塗りつぶされます。

上記以外にも、QPainter::brushOrigin() を使用したさまざまな例があります。具体的な用途に合わせて、コードを調整する必要があります。



テクスチャマトリックスを使用する

テクスチャマトリックスは、テクスチャをどのように変換するかを制御するために使用されます。brushOrigin() を使用してブラシの原点を設定する代わりに、テクスチャマトリックスを使用してテクスチャを移動することができます。

QPainter painter(widget);
QImage image("texture.png");
painter.setBrush(QBrush(image));

// テクスチャマトリックスを作成
QMatrix matrix;
matrix.translate(widget.width() / 2, widget.height() / 2);

// テクスチャマトリックスをブラシに設定
painter.setBrushTransform(matrix);

// 長方形を描画
painter.drawRect(0, 0, 100, 100);

この例では、QMatrix オブジェクトを使用してテクスチャマトリックスを作成します。translate() メソッドを使用して、テクスチャをウィジェットの中央に移動します。次に、setBrushTransform() メソッドを使用して、テクスチャマトリックスをブラシに設定します。

QTransform を使用する

QTransform は、2D 変換を表現するために使用されます。brushOrigin() を使用してブラシの原点を設定する代わりに、QTransform を使用してブラシを回転、拡大縮小、移動することができます。

QPainter painter(widget);
QImage image("texture.png");
painter.setBrush(QBrush(image));

// QTransformを作成
QTransform transform;
transform.translate(widget.width() / 2, widget.height() / 2);
transform.rotate(45);

// QTransformをブラシに設定
painter.setBrushTransform(transform);

// 長方形を描画
painter.drawRect(0, 0, 100, 100);

この例では、QTransform オブジェクトを使用して、ブラシを回転、拡大縮小、移動します。translate() メソッドを使用して、テクスチャをウィジェットの中央に移動します。rotate() メソッドを使用して、テクスチャを 45 度回転します。次に、setBrushTransform() メソッドを使用して、QTransform をブラシに設定します。

カスタムブラシクラスを作成する

独自のブラシクラスを作成することで、ブラシの原点をより柔軟に制御できます。

class MyBrush : public QBrush
{
public:
    MyBrush(const QImage& image)
        : QBrush(image)
    {}

    void setOrigin(const QPoint& origin)
    {
        m_origin = origin;
    }

protected:
    void paint(QPainter* painter, const QRect& rect) override
    {
        painter->save();
        painter->translate(-m_origin);
        QBrush::paint(painter, rect);
        painter->restore();
    }

private:
    QPoint m_origin;
};

この例では、MyBrush というカスタムブラシクラスを作成します。このクラスは、QBrush クラスから継承しており、setOrigin() メソッドを使用してブラシの原点を設定することができます。paint() メソッドは、ブラシを描画するためにオーバーライドされています。このメソッドは、translate() メソッドを使用してブラシを原点に移動し、QBrush クラスの paint() メソッドを呼び出してブラシを描画します。

どの方法が最適か

どの代替方法が最適かは、状況によって異なります。

  • ブラシの原点をより精密に制御したい場合は、カスタムブラシクラスを使用する必要があります。
  • テクスチャを回転、拡大縮小、移動したい場合は、QTransform またはカスタムブラシクラスを使用する必要があります。
  • テクスチャを単純に移動したい場合は、QTransform を使用するのが最も簡単です。