【初心者向け】Qt GUIでブラシの原点を設定して描画をもっと自由に!QPainter::setBrushOrigin()チュートリアル


QPainter::setBrushOrigin() は、Qt GUIにおける描画操作において、ブラシの原点を設定するための関数です。ブラシは、図形の内側を塗りつぶすために使用されるパターンや色を定義します。ブラシの原点は、ブラシのパターンがどのように配置されるかを決定します。

使い方

void QPainter::setBrushOrigin(const QPoint &origin);

この関数は、origin パラメータで指定されたポイントをブラシの原点として設定します。

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

// ブラシの原点をウィジェットの中央に設定
painter.setBrushOrigin(widget->rect().center());

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

この例では、赤色のブラシで長方形を描画しています。ブラシの原点はウィジェットの中央に設定されているため、ブラシのパターンはウィジェットの中央から始まり、全体に広がります。

  • ブラシの原点は、複数のブラシ操作に影響を与えます。
  • ブラシの原点は、QPainter::begin()QPainter::end() の間にのみ設定できます。
  • ブラシの原点は、デフォルトではウィジェットの左上に設定されています。


例 1: ブラシの原点を異なる位置に設定

QPainter painter(widget);

// ブラシを青色に設定
painter.setBrush(Qt::blue);

// ブラシの原点をウィジェットの左上に設定
painter.setBrushOrigin(QPoint(0, 0));
painter.drawRect(0, 0, 50, 50); // 左上隅から塗りつぶし

// ブラシの原点をウィジェットの中央に設定
painter.setBrushOrigin(widget->rect().center());
painter.drawRect(50, 0, 50, 50); // 中央から塗りつぶし

// ブラシの原点をウィジェットの右下に設定
painter.setBrushOrigin(QPoint(widget->width(), widget->height()));
painter.drawRect(100, 0, 50, 50); // 右下隅から塗りつぶし

この例では、ブラシの原点を異なる位置に設定することで、ブラシのパターンがどのように配置されるかを変化させています。

例 2: ブラシの原点を画像に合わせて設定

QPainter painter(widget);

// 画像を読み込む
QImage image("image.png");

// ブラシを画像のパターンに設定
painter.setBrush(QBrush(image));

// ブラシの原点を画像の中央に設定
painter.setBrushOrigin(image.rect().center());

// 画像を描画
painter.drawImage(0, 0, image);

この例では、ブラシを画像のパターンに設定し、ブラシの原点を画像の中央に設定することで、画像全体を塗りつぶしています。

例 3: ブラシの原点をアニメーションさせる

QPainter painter(widget);

// ブラシを赤色に設定
painter.setBrush(Qt::red);

// ブラシの原点をアニメーションさせる
QPoint origin(0, 0);
int animationStep = 0;

while (true) {
  // ブラシの原点を更新
  origin.setX((animationStep % widget->width()) * 2);
  origin.setY((animationStep % widget->height()) * 2);
  painter.setBrushOrigin(origin);

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

  // アニメーションステップを進める
  animationStep++;

  // ウィジェットを更新
  widget->update();

  // 10ミリ秒待つ
  QThread::msleep(10);
}

この例では、ブラシの原点をアニメーションさせることで、ブラシのパターンが常に動き続けるようにしています。

  • Qt の最新バージョンを使用していることを確認してください。


代替方法

  1. QBrush::setOrigin()` を使用する

QPainter::setBrushOrigin() は、ブラシの原点をペインター座標系で設定しますが、QBrush::setOrigin() はブラシの原点をブラシ座標系で設定します。ブラシ座標系は、ブラシ自体の内部座標系であり、ペインター座標系とは独立しています。

QPainter painter(widget);

// ブラシを青色に設定
painter.setBrush(Qt::blue);

// ブラシの原点をブラシ座標系の中央に設定
brush.setOrigin(brush.rect().center());

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

この例では、QBrush::setOrigin() を使用して、ブラシの原点をブラシ座標系の中央に設定しています。

  1. QTransform を使用する

QTransform は、2D グラフィックス変換を定義するためのクラスです。QTransform を使用して、ブラシのパターンを回転、拡大縮小、移動することができます。ブラシの原点を設定するには、QTransform::translate() メソッドを使用します。

QPainter painter(widget);

// ブラシを青色に設定
painter.setBrush(Qt::blue);

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

// ブラシのパターンを transform で変換
painter.setBrushTransform(transform);

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

この例では、QTransform を使用して、ブラシのパターンをウィジェットの中央に移動しています。

それぞれの方法の比較

方法利点欠点
QPainter::setBrushOrigin()シンプルで使いやすいブラシ座標系を理解する必要がない
QBrush::setOrigin()ブラシ座標系に基づいてより精密な制御が可能ブラシ座標系を理解する必要がある
QTransformブラシのパターンを回転、拡大縮小、移動できる複雑で、より多くのコードが必要

QPainter::setBrushOrigin() は、ブラシの原点を設定するための最もシンプルで一般的な方法です。しかし、より精密な制御が必要な場合は、QBrush::setOrigin() または QTransform を使用することができます。

  • Qt の最新バージョンを使用していることを確認してください。
  • 上記の代替方法はあくまでも例であり、実際の用途に合わせて変更する必要があります。