Qt GUIプログラミング:QPainter::setWorldMatrixEnabled()で描画をレベルアップ


QPainter::setWorldMatrixEnabled()は、Qt GUIにおける描画操作における座標変換を制御する関数です。この関数は、ワールド変換行列と呼ばれる行列を使用して、描画されるすべてのオブジェクトの座標をどのように変換するかを決定します。

ワールド変換行列とは

ワールド変換行列は、描画されるすべてのオブジェクトの座標をどのように変換するかを定義する行列です。この行列は、回転、拡大縮小、移動などの変換を表現するために使用できます。

QPainter::setWorldMatrixEnabled()の役割

QPainter::setWorldMatrixEnabled()は、ワールド変換行列を使用した座標変換を有効または無効にします。この関数は、以下の2つの引数を受け取ります。

  • enable: ブール値。trueの場合、ワールド変換行列を使用した座標変換が有効になります。falseの場合、無効になります。

QPainter painter;

// ワールド変換行列を定義
QTransform worldTransform;
worldTransform.rotate(45);
worldTransform.scale(2, 2);

// ワールド変換行列を有効にする
painter.setWorldMatrixEnabled(true);

// ワールド変換行列を設定
painter.setWorldTransform(worldTransform);

// 四角形を描画
painter.drawRect(0, 0, 100, 100);

// ワールド変換行列を無効にする
painter.setWorldMatrixEnabled(false);

// もう一つの四角形を描画
painter.drawRect(150, 0, 100, 100);

この例では、最初の四角形はワールド変換行列を使用して回転と拡大縮小されます。2番目の四角形はワールド変換行列の影響を受けずに描画されます。

  • ワールド変換行列は、描画されるすべてのオブジェクトに影響を与えます。個々のオブジェクトに異なる変換を適用したい場合は、QPainter::translate(), QPainter::rotate(), QPainter::scale()などの他の変換関数を使用する必要があります。
  • QPainter::setWorldMatrixEnabled()関数は、現在のペインタオブジェクトにのみ影響を与えます。他のペインタオブジェクトには影響を与えません。


サンプル 1: 回転と拡大縮小

#include <QApplication>
#include <QPainter>

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

  // ウィジェットを作成
  QWidget widget;
  widget.resize(300, 300);
  widget.show();

  // ペインタを作成
  QPainter painter(&widget);

  // ワールド変換行列を定義
  QTransform worldTransform;
  worldTransform.rotate(45);
  worldTransform.scale(2, 2);

  // ワールド変換行列を有効にする
  painter.setWorldMatrixEnabled(true);

  // ワールド変換行列を設定
  painter.setWorldTransform(worldTransform);

  // 四角形を描画
  painter.drawRect(0, 0, 100, 100);

  // ワールド変換行列を無効にする
  painter.setWorldMatrixEnabled(false);

  // もう一つの四角形を描画
  painter.drawRect(150, 0, 100, 100);

  return app.exec();
}

サンプル 2: 移動

#include <QApplication>
#include <QPainter>

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

  // ウィジェットを作成
  QWidget widget;
  widget.resize(300, 300);
  widget.show();

  // ペインタを作成
  QPainter painter(&widget);

  // ワールド変換行列を定義
  QTransform worldTransform;
  worldTransform.translate(50, 50);

  // ワールド変換行列を有効にする
  painter.setWorldMatrixEnabled(true);

  // ワールド変換行列を設定
  painter.setWorldTransform(worldTransform);

  // 四角形を描画
  painter.drawRect(0, 0, 100, 100);

  return app.exec();
}
#include <QApplication>
#include <QPainter>

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

  // ウィジェットを作成
  QWidget widget;
  widget.resize(300, 300);
  widget.show();

  // ペインタを作成
  QPainter painter(&widget);

  // ワールド変換行列を定義
  QTransform worldTransform;
  worldTransform.translate(50, 50);
  worldTransform.rotate(45);
  worldTransform.scale(2, 2);

  // ワールド変換行列を有効にする
  painter.setWorldMatrixEnabled(true);

  // ワールド変換行列を設定
  painter.setWorldTransform(worldTransform);

  // 四角形を描画
  painter.drawRect(0, 0, 100, 100);

  return app.exec();
}


個々の変換関数を使用する

QPainter::setWorldMatrixEnabled()は、ワールド変換行列を使用してすべてのオブジェクトに一括して変換を適用します。個々のオブジェクトに異なる変換を適用したい場合は、QPainter::translate(), QPainter::rotate(), QPainter::scale()などの個々の変換関数を使用することができます。

QPainter painter;

// 四角形を描画
painter.drawRect(0, 0, 100, 100);

// 四角形を移動
painter.translate(50, 50);

// もう一つの四角形を描画
painter.drawRect(0, 0, 100, 100);

// 四角形を回転
painter.rotate(45);

// もう一つの四角形を描画
painter.drawRect(0, 0, 100, 100);

// 四角形を拡大縮小
painter.scale(2, 2);

// もう一つの四角形を描画
painter.drawRect(0, 0, 100, 100);

この例では、QPainter::translate(), QPainter::rotate(), QPainter::scale()を使用して、個々の四角形に異なる変換を適用しています。

QPainter::setTransform()を使用する

QPainter painter;

// ワールド変換行列を定義
QTransform worldTransform;
worldTransform.translate(50, 50);
worldTransform.rotate(45);
worldTransform.scale(2, 2);

// 変換状態を設定
painter.setTransform(worldTransform);

// 四角形を描画
painter.drawRect(0, 0, 100, 100);

この例では、QPainter::setTransform()を使用して、ワールド変換行列をペインタオブジェクトの現在の変換状態として設定しています。

QGraphicsViewを使用する

QGraphicsViewは、グラフィックシーンをレンダリングするためのウィジェットです。QGraphicsViewを使用すると、シーン内のオブジェクトに対して個別に座標変換を適用することができます。

#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsRectItem>

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

  // シーンを作成
  QGraphicsScene scene;

  // 四角形アイテムを作成
  QGraphicsRectItem *rectItem1 = new QGraphicsRectItem(0, 0, 100, 100);
  scene.addItem(rectItem1);

  // もう一つの四角形アイテムを作成
  QGraphicsRectItem *rectItem2 = new QGraphicsRectItem(0, 0, 100, 100);
  rectItem2->setPos(50, 50);
  scene.addItem(rectItem2);

  // ビューを作成
  QGraphicsView view(&scene);
  view.resize(300, 300);
  view.show();

  return app.exec();
}

この例では、QGraphicsSceneQGraphicsViewを使用して、シーン内の2つの四角形アイテムに異なる座標変換を適用しています。

QPainter::setWorldMatrixEnabled()は、Qt GUIにおける描画操作における座標変換を制御するための便利な関数ですが、状況によっては代替方法がより適切な場合があります。個々の変換関数を使用する、QPainter::setTransform()を使用する、QGraphicsViewを使用するなど、代替方法はいくつかあります。