【保存版】Qt Widgetsで線を描画・操作する際の基本テクニック:QGraphicsLineItem::line()メソッド


QGraphicsLineItem::line() メソッドは、QGraphicsLineItem アイテムが描画する線の情報にアクセスするためのものです。このメソッドは、線の始点と終点座標を含む QLineF 構造体を返します。

構文

QLineF QGraphicsLineItem::line() const

戻り値

線の情報を含む QLineF 構造体

詳細

QGraphicsLineItem アイテムは、2 点間の直線を描画するために使用されます。これらの点の座標は、QLineF 構造体によって表現されます。line() メソッドは、この構造体へのアクセスを提供し、線の始点と終点の座標を取得することができます。

QGraphicsLineItem *lineItem = new QGraphicsLineItem();
scene->addItem(lineItem);

// 線の始点と終点の座標を取得
QLineF line = lineItem->line();
qreal startX = line.x1();
qreal startY = line.y1();
qreal endX = line.x2();
qreal endY = line.y2();

// 取得した座標を使用して何か処理を行う
  • アイテムが移動された場合、line() メソッドは自動的に更新されません。線の情報が最新であることを確認するには、update() メソッドを呼び出す必要があります。
  • line() メソッドは、アイテムがシーンに追加された後でのみ有効です。


#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsLineItem>
#include <QPainter>

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

    // シーンを作成
    QGraphicsScene scene;

    // 線を作成
    QGraphicsLineItem *lineItem = new QGraphicsLineItem();
    lineItem->setLine(QPointF(0, 0), QPointF(100, 100));
    scene->addItem(lineItem);

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

    return app.exec();
}

このコードを実行すると、以下のようなウィンドウが表示されます。

緑色の線が描画されています。

このコードでは、以下の処理が行われています。

  1. QGraphicsScene オブジェクトを作成します。
  2. QGraphicsLineItem オブジェクトを作成し、その線の始点と終点を設定します。
  3. QGraphicsScene オブジェクトに QGraphicsLineItem オブジェクトを追加します。
  4. QGraphicsView オブジェクトを作成し、QGraphicsScene オブジェクトを設定します。
  5. QGraphicsView オブジェクトを表示します。

line() メソッドを使用して、線の情報から矩形を描画するには、以下のコードを追加します。

// 線の始点と終点の座標を取得
QLineF line = lineItem->line();
qreal startX = line.x1();
qreal startY = line.y1();
qreal endX = line.x2();
qreal endY = line.y2();

// 矩形の幅と高さを計算
qreal width = endX - startX;
qreal height = endY - startY;

// 矩形を作成
QGraphicsRectItem *rectItem = new QGraphicsRectItem(startX, startY, width, height);
rectItem->setBrush(Qt::red);
scene->addItem(rectItem);

このコードを追加すると、緑色の線の代わりに赤い矩形が表示されます。

  1. line() メソッドを使用して、線の始点と終点の座標を取得します。
  2. 矩形の幅と高さを計算します。
  3. QGraphicsRectItem オブジェクトを作成し、その位置、幅、高さを設定します。
  4. 矩形を赤色で塗りつぶします。
  5. QGraphicsScene オブジェクトに QGraphicsRectItem オブジェクトを追加します。


代替方法

  • itemTransform() メソッド
    itemTransform() メソッドは、アイテムの変換行列を返します。この変換行列を使用して、線の始点と終点の座標を変換することができます。変換された座標を取得するには、以下のコードを使用できます。

    QGraphicsLineItem *lineItem = new QGraphicsLineItem();
    scene->addItem(lineItem);
    
    // 変換行列を取得
    QTransform transform = lineItem->itemTransform();
    
    // 始点と終点の座標を取得
    QPointF startPoint = lineItem->line().startPoint();
    QPointF endPoint = lineItem->line().endPoint();
    
    // 座標を変換
    QPointF transformedStartPoint = transform.map(startPoint);
    QPointF transformedEndPoint = transform.map(endPoint);
    
  • boundingRect() メソッド
    boundingRect() メソッドは、アイテムの境界矩形を返します。この境界矩形は、線の始点と終点を含む四角形です。境界矩形から線の始点と終点の座標を取得するには、以下のコードを使用できます。

    QGraphicsLineItem *lineItem = new QGraphicsLineItem();
    scene->addItem(lineItem);
    
    // 境界矩形を取得
    QRectF boundingRect = lineItem->boundingRect();
    
    // 始点と終点の座標を取得
    qreal startX = boundingRect.x();
    qreal startY = boundingRect.y();
    qreal endX = boundingRect.x() + boundingRect.width();
    qreal endY = boundingRect.y() + boundingRect.height();
    

選択方法

どの代替方法を使用するかは、状況によって異なります。

  • itemTransform() メソッド

    • アイテムが回転されている場合など、変換された座標が必要な場合に適しています。
    • 変換行列を操作する処理がすでに存在する場合に適しています。
  • boundingRect() メソッド

    • 線の始点と終点の座標だけでなく、線の太さなどの情報も必要ない場合に適しています。
    • 境界矩形を計算する処理がすでに存在する場合に適しています。
  • コードの簡潔性: line() メソッドは、最も簡潔な方法で線の情報にアクセスできます。
  • パフォーマンス: boundingRect() メソッドの方が itemTransform() メソッドよりも高速に実行される傾向があります。