【初心者向け】Qt GUIで複雑な変換を簡単に行う:QTransform::operator-=()の仕組みとサンプルコード


QTransform::operator-=() は、Qt GUI における 2D 変換を表す QTransform クラスのメンバー関数の一つです。この関数は、現在の変換行列から指定された行列を引く操作を実行します。つまり、現在の変換を指定された変換の逆方向に変換します。

構文

QTransform &QTransform::operator-= (const QTransform &other);

引数

  • other: 現在の変換行列から引かれる変換行列を表す QTransform オブジェクト

戻り値

  • 現在の QTransform オブジェクトへの参照

詳細

QTransform::operator-=() は、以下の変換を現在の変換行列に適用します。

  1. 指定された other 変換行列の逆行列を計算します。
  2. 現在の変換行列と other 変換行列の逆行列を掛け合わせます。
  3. 計算結果を現在の変換行列に代入します。
QTransform transform;
transform.translate(10, 20); // 原点を (10, 20) に移動

QTransform otherTransform;
otherTransform.scale(0.5, 0.5); // スケールを 0.5 倍にする

transform -= otherTransform; // 現在の変換を 0.5 倍縮小

// transform は現在、原点を (5, 10) に移動し、スケールが 0.5 倍の状態になります
  • QTransform::operator-=() は、2D グラフィックスにおける様々な操作に役立ちます。例えば、オブジェクトを特定の方向に移動してから回転させるような操作に使用できます。
  • QTransform::operator-=() は、QTransform::operator*= と似ていますが、QTransform::operator-=() は現在の変換行列を 逆方向に変換 する点が異なります。


#include <QApplication>
#include <QLabel>
#include <QPainter>

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

  // ラベルを作成
  QLabel label("Hello, World!");
  label.setGeometry(100, 100, 200, 50);

  // 変換オブジェクトを作成
  QTransform transform;

  // オブジェクトを (50, 50) に移動
  transform.translate(50, 50);

  // オブジェクトを 45 度回転
  transform.rotate(45);

  // 変換をラベルに適用
  label.setTransform(transform);

  // ウィンドウを表示
  label.show();

  return app.exec();
}

解説

  1. main() 関数内で、QLabel オブジェクト label を作成します。
  2. QTransform オブジェクト transform を作成します。
  3. transform.translate(50, 50); で、オブジェクトを (50, 50) に移動します。
  4. transform.rotate(45); で、オブジェクトを 45 度回転します。
  5. label.setTransform(transform); で、transform による変換を label に適用します。
  6. label.show(); で、label をウィンドウに表示します。


しかし、状況によっては QTransform::operator-=() を使用するよりも、他の方法の方が効率的であったり、より分かりやすかったりする場合があります。

ここでは、QTransform::operator-=() の代替方法として、以下の2つの方法を紹介します。

QTransform::operator*=() を使用する

QTransform::operator*=() は、現在の変換行列に指定された行列を掛け合わせる操作を実行します。この関数は、QTransform::operator-=() と似ていますが、現在の変換を指定された変換の方向に変換 する点が異なります。

以下は、QTransform::operator-=()QTransform::operator*=() で置き換えた例です。

QTransform transform;
transform.translate(10, 20); // 原点を (10, 20) に移動

QTransform otherTransform;
otherTransform.scale(0.5, 0.5); // スケールを 0.5 倍にする

transform *= otherTransform.inverted(); // 現在の変換を 0.5 倍縮小

// transform は現在、原点を (5, 10) に移動し、スケールが 0.5 倍の状態になります

QMatrix を使用する

QMatrix クラスは、2D 変換を表すもう一つのクラスです。QTransform クラスと同様に、QMatrix クラスも様々な変換操作を実行することができます。

以下は、QTransform::operator-=()QMatrix で置き換えた例です。

QMatrix transform;
transform.translate(10, 20); // 原点を (10, 20) に移動

QMatrix otherTransform;
otherTransform.scale(0.5, 0.5); // スケールを 0.5 倍にする

QMatrix invertedOtherTransform = otherTransform.inverted();
transform.multiply(&invertedOtherTransform); // 現在の変換を 0.5 倍縮小

// transform は現在、原点を (5, 10) に移動し、スケールが 0.5 倍の状態になります

どちらの方法を選択するべきか

どの方法を選択するべきかは、状況によって異なります。

  • QMatrix は、より柔軟な変換操作を実行したい場合に適しています。
  • QTransform::operator*=() は、現在の変換を指定された変換の方向に変換したい場合に適しています。
  • QTransform::operator-=() は、簡潔で分かりやすいコードを書くのに適しています。