【保存版】『Qt Widgets』で『QGraphicsScale::origin』を使いこなして、ワンランク上のプログラミングへ


QGraphicsScale::origin は、Qt Widgets ライブラリの一部である QGraphicsScale クラスのメンバー関数です。この関数は、アイテムがスケーリングされる基準点である 原点 を取得または設定するために使用されます。原点は、アイテムの親アイテムに対する相対的な位置で、スケーリング操作を行っても常に固定されます。

詳細

QGraphicsScale::origin は、QVector3D 型の値を返します。この値は、3D空間における原点の位置を表します。デフォルトでは、原点は (0, 0, 0) に設定されています。

原点を設定するには、setOrigin() メソッドを使用します。このメソッドには、QVector3D 型の値を渡す必要があります。

QVector3D newOrigin(10, 20, 30);
item->setScale(scale);
item->setOrigin(newOrigin);

上記のコードでは、item という名前のアイテムのスケーリングを scale オブジェクトで設定し、原点を (10, 20, 30) に設定しています。

次の例では、QGraphicsScale クラスを使用して、アイテムを拡大縮小し、回転させる方法を示します。

#include <QGraphicsScale>
#include <QGraphicsItem>
#include <QGraphicsScene>

class MyItem : public QGraphicsItem
{
public:
    MyItem()
    {
        setFlag(QGraphicsItem::ItemIsMovable);
        setFlag(QGraphicsItem::ItemIsSelectable);

        QGraphicsScale *scale = new QGraphicsScale();
        scale->setXScale(2.0);
        scale->setYScale(2.0);
        setScale(scale);

        QGraphicsRotation *rotation = new QGraphicsRotation();
        rotation->setAngle(45.0);
        setRotation(rotation);
    }
};

int main()
{
    QGraphicsScene scene;
    MyItem *item = new MyItem();
    scene.addItem(item);

    QGraphicsView view(&scene);
    view.show();

    return app.exec();
}

上記のコードでは、MyItem という名前のアイテムを作成し、それをシーンに追加しています。アイテムは、QGraphicsScale オブジェクトを使用して 2 倍に拡大縮小され、QGraphicsRotation オブジェクトを使用して 45 度回転されます。



#include <QGraphicsScale>
#include <QGraphicsItem>
#include <QGraphicsScene>

class MyItem : public QGraphicsItem
{
public:
    MyItem()
    {
        setFlag(QGraphicsItem::ItemIsMovable);
        setFlag(QGraphicsItem::ItemIsSelectable);

        QGraphicsScale *scale = new QGraphicsScale();
        scale->setXScale(2.0);
        scale->setYScale(2.0);
        setScale(scale);
    }
};

int main()
{
    QGraphicsScene scene;
    MyItem *item = new MyItem();
    scene.addItem(item);

    QGraphicsView view(&scene);
    view.show();

    return app.exec();
}

例 2: アイテムを特定の点を中心に拡大縮小

この例では、QGraphicsScale::origin メソッドを使用して、アイテムを特定の点を中心に 2 倍に拡大縮小する方法を示します。

#include <QGraphicsScale>
#include <QGraphicsItem>
#include <QGraphicsScene>

class MyItem : public QGraphicsItem
{
public:
    MyItem()
    {
        setFlag(QGraphicsItem::ItemIsMovable);
        setFlag(QGraphicsItem::ItemIsSelectable);

        QGraphicsScale *scale = new QGraphicsScale();
        scale->setXScale(2.0);
        scale->setYScale(2.0);
        scale->setOrigin(QVector3D(50, 50, 0));
        setScale(scale);
    }
};

int main()
{
    QGraphicsScene scene;
    MyItem *item = new MyItem();
    scene.addItem(item);

    QGraphicsView view(&scene);
    view.show();

    return app.exec();
}

例 3: アイテムを拡大縮小し、回転

この例では、QGraphicsScale クラスと QGraphicsRotation クラスを使用して、アイテムを拡大縮小し、回転する方法を示します。

#include <QGraphicsScale>
#include <QGraphicsRotation>
#include <QGraphicsItem>
#include <QGraphicsScene>

class MyItem : public QGraphicsItem
{
public:
    MyItem()
    {
        setFlag(QGraphicsItem::ItemIsMovable);
        setFlag(QGraphicsItem::ItemIsSelectable);

        QGraphicsScale *scale = new QGraphicsScale();
        scale->setXScale(2.0);
        scale->setYScale(2.0);
        setScale(scale);

        QGraphicsRotation *rotation = new QGraphicsRotation();
        rotation->setAngle(45.0);
        setRotation(rotation);
    }
};

int main()
{
    QGraphicsScene scene;
    MyItem *item = new MyItem();
    scene.addItem(item);

    QGraphicsView view(&scene);
    view.show();

    return app.exec();
}


代替方法

  • アイテムの移動
    アイテムを原点に移動することで、同じ効果を得ることができます。これは、setPos() メソッドを使用して行うことができます。
item->setPos(QPoint(0, 0));
  • アイテムのアタッチポイント
    アイテムのアタッチポイントを設定することで、スケーリング操作の中心点を制御できます。これは、setTransformationAnchor() メソッドを使用して行うことができます。
item->setTransformationAnchor(QPoint(50, 50));
  • カスタム変換マトリックス
    カスタム変換マトリックスを使用して、アイテムをスケーリングおよび回転することができます。これは、setTransform() メソッドを使用して行うことができます。
QTransform transform;
transform.translate(-50, -50);
transform.scale(2.0, 2.0);
transform.rotate(45.0);
item->setTransform(transform);

それぞれの方法の利点と欠点

  • カスタム変換マトリックス
    最も柔軟性の高い方法ですが、最も複雑な方法でもあります。
  • アイテムのアタッチポイント
    アイテムの位置を固定することができますが、原点以外の点を中心にスケーリングする場合は、setOrigin() メソッドよりも複雑になります。
  • アイテムの移動
    最もシンプルで簡単な方法ですが、アイテムの位置を固定することはできません。

状況に応じて、QGraphicsScale::origin の代替方法を使用することを検討してください。それぞれの方法の利点と欠点を理解し、ニーズに合った方法を選択することが重要です。