QGraphicsView::sceneRect
まず、QtのGraphics View FrameworkにおけるQGraphicsView
とQGraphicsScene
の基本的な役割を理解することが重要です。
QGraphicsView
: これは「ビュー」であり、QGraphicsScene
の内容を表示するためのウィジェットです。シーン全体を表示することも、一部を拡大・縮小して表示することも可能です。ユーザーからの入力(マウスイベント、キーボードイベントなど)を受け取り、それをシーン内のアイテムに伝播させる役割も持ちます。QGraphicsScene
: これは「シーン」であり、グラフィックアイテム(図形、画像、テキストなど)を管理するキャンバスのようなものです。アイテムの追加、削除、位置の管理、衝突検出などを担当します。QGraphicsScene
自体は見た目を持たず、描画は行いません。
この二つのsceneRect
は、名前は似ていますが、それぞれ異なる意味と役割を持っています。
QGraphicsScene::sceneRect()
- 特性:
- デフォルトでは、シーン内のすべてのアイテムを囲む最小の矩形が自動的に計算されます。アイテムが追加、移動、削除されると、この矩形も自動的に更新されます(ただし、縮小はしません)。
setSceneRect()
メソッドを使って、この矩形を明示的に設定することもできます。大規模なシーンでは、明示的に設定することでパフォーマンスが向上する場合があります。
- 役割:
- アイテムのインデックス管理:
QGraphicsScene
は、このsceneRect
を使用して、アイテムを効率的に検索・管理するための内部的なインデックスを構築します。 - デフォルトのスクロール範囲:
QGraphicsView
がsceneRect
を明示的に設定されていない場合、QGraphicsScene::sceneRect()
の値がビューのスクロール可能な領域のデフォルトとして使用されます。
- アイテムのインデックス管理:
- 定義:
QGraphicsScene
が管理するアイテムの範囲を示す矩形です。これは、シーン内のすべてのアイテムを含む最小の矩形、または明示的に設定された矩形を指します。
QGraphicsView::sceneRect()
- 特性:
- もし
QGraphicsView::sceneRect()
が明示的に設定されていない場合、関連付けられているQGraphicsScene
のsceneRect()
(すなわちQGraphicsScene::sceneRect()
)がデフォルトとして使用されます。 QGraphicsView::setSceneRect()
を呼び出すことで、QGraphicsView
独自の表示領域を設定することができます。これにより、QGraphicsScene
の実際のsceneRect
とは異なる部分だけをビューに表示させたり、スクロール範囲を制限したりすることが可能になります。- 例えば、
QGraphicsScene
自体は非常に広大な領域を持つが、特定のQGraphicsView
ではその中の特定の小さな領域だけを表示し、スクロールバーの範囲もその小さな領域に限定したい、といった場合にこの機能が役立ちます。
- もし
- 役割:
- 表示領域の制御:
QGraphicsView
がシーンのどの部分を「見ている」かを定義します。 - スクロールバーの範囲: ビューにスクロールバーがある場合、この
sceneRect
がスクロール可能な範囲を決定します。
- 表示領域の制御:
- 定義:
QGraphicsView
が表示するQGraphicsScene
のどの領域を表示するか、そしてビューのスクロールバーの範囲を決定する矩形です。
要するに、
QGraphicsView::sceneRect
: そのビューが「見る」シーンの領域、およびスクロールバーの範囲を決定する矩形。明示的に設定しない場合は、関連するQGraphicsScene
のsceneRect
が使われる。QGraphicsScene::sceneRect
: シーンそのものの「広さ」や、アイテムのインデックス管理に使われる基準となる矩形。
よくある間違い
- 初期表示の問題: アプリケーション起動時に、
QGraphicsView
がシーンの全てを一度に表示しようとして、アイテムが画面外に押し出されることがあります。 - ビューの配置ミス:
QGraphicsView
が親ウィジェット内で正しくレイアウトされていない場合、ビュー自体が表示されない、あるいは非常に小さく表示されることがあります。 QGraphicsScene::sceneRect()
とQGraphicsView::sceneRect()
の混同: シーンにアイテムを追加したが、ビューに何も表示されない場合、QGraphicsScene::sceneRect()
の範囲外にアイテムを配置しているか、QGraphicsView::sceneRect()
が適切に設定されていない可能性があります。
- アラインメントの確認:
QGraphicsView
はデフォルトでシーンを中央に表示しようとします。左上を原点として表示したい場合は、view->setAlignment(Qt::AlignLeft | Qt::AlignTop)
を設定します。 fitInView()
の使用: シーン全体をビューに収まるように表示したい場合、view->fitInView(scene->sceneRect(), Qt::KeepAspectRatio)
などを呼び出すことで、ビューのサイズに合わせてシーンをスケールさせることができます。これは、アプリケーションの初期化時やビューのリサイズイベントで役立ちます。- ビューの配置とサイズ:
- Qt Designerを使用している場合は、
QGraphicsView
が適切なレイアウト内にあるか、サイズポリシーが適切に設定されているかを確認します。 - コードでビューを生成している場合は、
view->resize()
やレイアウトへの追加が正しく行われているかを確認します。
- Qt Designerを使用している場合は、
QGraphicsView::sceneRect()
の設定:view->setSceneRect(scene->sceneRect())
のように、ビューのシーン矩形をシーンのそれに合わせることで、シーン全体をビューが「見る」ように設定します。- もし、ビューの表示領域を特定の範囲に制限したい場合は、
view->setSceneRect(QRectF(x, y, width, height))
のように明示的に設定します。
QGraphicsScene::sceneRect()
を確認:scene->itemsBoundingRect()
を呼び出して、現在のシーン内の全アイテムを囲む最小の矩形を確認します。この矩形が予想と異なる場合、アイテムの座標設定に誤りがある可能性があります。scene->setSceneRect()
で明示的にシーンの矩形を設定し、その範囲内にアイテムを配置するようにします。特に、シーンが動的に変化する場合(アイテムの追加・削除など)は、この設定が重要です。
スクロールバーが正しく動作しない、または表示されない
QGraphicsView::setVerticalScrollBarPolicy()
/setHorizontalScrollBarPolicy()
の設定: スクロールバーの表示ポリシーがQt::ScrollBarAlwaysOff
などに設定されていると、当然スクロールバーは表示されません。QGraphicsScene::sceneRect()
が小さすぎる、または未設定: スクロールバーは、ビューのsceneRect
(明示的に設定されていない場合はシーンのsceneRect
)がビューポートよりも大きい場合に表示されます。この矩形が小さすぎるか、アイテムが追加されていないために自動計算で空の矩形になっている場合、スクロールバーは表示されません。
- スクロールバーポリシーの確認:
view->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded)
やview->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded)
がデフォルトであり、必要に応じてスクロールバーが表示されますが、誤って変更されていないか確認します。
QGraphicsView::setSceneRect()
の確認と設定:QGraphicsView
が独自のsceneRect
を持っている場合、それがスクロールの範囲を決定します。この矩形が適切に設定されているか確認します。
QGraphicsScene::sceneRect()
の確認と設定:- 前述の通り、シーンの
sceneRect
が実際に表示したい領域をカバーしているか確認します。特に、アイテムの座標が負の値を含んでいたり、広範囲にわたる場合は、適切な矩形を設定することが重要です。 scene->setSceneRect()
で明示的に広めの範囲を設定し、スクロール可能であることを確認します。
- 前述の通り、シーンの
ズームイン/アウト時に問題が発生する(精度、描画、パフォーマンス)
- レンダリングヒントとキャッシュモードの不足: 高DPI環境や複雑な描画では、適切なレンダリングヒントやキャッシュモードが設定されていないと、ズーム時に描画が粗くなったり、パフォーマンスが低下したりします。
QGraphicsItem::boundingRect()
の不正確さ: アイテムのboundingRect()
が実際の内容よりも小さい場合、ズームイン/アウト時にアイテムの一部が描画されないことがあります。- シーン座標の範囲が大きすぎる:
QGraphicsScene
は浮動小数点座標を使用しますが、非常に広大なシーン座標(例えば、数万~数百万単位)を持つ場合、特定のズームレベルで浮動小数点精度が問題になったり、描画パフォーマンスが低下したりすることがあります。また、内部的なスクロールバーの値が整数ベースのため、ズーム時に最大値を超えてしまい、スクロールがおかしくなることがあります。
- キャッシュモードの活用:
view->setCacheMode(QGraphicsView::CacheBackground);
view->setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
- 複雑な背景や頻繁に更新されない部分がある場合、これらのキャッシュモードを適切に設定することで、描画パフォーマンスを改善できます。
- レンダリングヒントの活用:
view->setRenderHint(QPainter::Antialiasing, true);
view->setRenderHint(QPainter::SmoothPixmapTransform, true);
- これらのレンダリングヒントを設定することで、ズーム時の描画品質を向上させることができます。
QGraphicsItem::boundingRect()
の正確性:- カスタムアイテムを作成している場合、
boundingRect()
の実装がアイテムの描画範囲を正確にカバーしていることを確認します。これは、アイテムの再描画領域の決定に非常に重要です。
- カスタムアイテムを作成している場合、
- シーン座標のスケーリング:
- もし扱うデータが非常に大きな地理的座標などである場合、シーンに追加する前にデータの座標を小さな範囲にスケーリングすることを検討します。例えば、
1.0e-6
などの係数を掛けてシーンに追加し、必要に応じてQGraphicsView
側で元のスケールに戻す変換を行うなどです。これにより、内部的な計算精度が向上し、スクロールバーの整数制限の問題を回避できる場合があります。
- もし扱うデータが非常に大きな地理的座標などである場合、シーンに追加する前にデータの座標を小さな範囲にスケーリングすることを検討します。例えば、
シーンの更新が反映されない
- 不適切な
QGraphicsItem::setPos()
やmoveBy()
の使用: アイテムの座標を変更する際、setPos()
やmoveBy()
を使用せずに、QGraphicsItem::pos()
を直接変更しようとすると、変更が検出されず、ビューが更新されないことがあります。 update()
の呼び忘れ: アイテムの位置やプロパティを変更した後、シーンやアイテムのupdate()
メソッドを呼び忘れると、変更がビューに反映されません。
QGraphicsView::viewport()->update()
: シーンの変更ではないが、ビューポート自体の何らかの更新が必要な場合は、view->viewport()->update()
を呼び出します。QGraphicsItem::update()
またはQGraphicsScene::update()
: アイテムの見た目を変更した場合、そのアイテムのupdate()
を呼び出すか、シーン全体を更新するためにscene->update()
を呼び出すことで、ビューが再描画されます。
- 座標系の理解:
QGraphicsScene
、QGraphicsItem
、QGraphicsView
はそれぞれ独自の座標系を持っています。mapToScene()
、mapFromScene()
、mapToItem()
などのマッピング関数を理解し、適切に使用することが重要です。 - デバッグ時の可視化:
QGraphicsScene::drawBackground()
またはdrawForeground()
をオーバーライドして、sceneRect()
の境界線を描画すると、デバッグ時にsceneRect()
の範囲を視覚的に確認でき、問題の特定に役立ちます。
QGraphicsView::sceneRect
は、ビューがシーンのどの領域を表示し、スクロールバーの範囲を決定するかを制御します。明示的に設定しない場合、関連付けられた QGraphicsScene
の sceneRect()
(シーン内のすべてのアイテムの境界矩形) が使用されます。
この例では、複数のアイテムを含むシーンを作成し、そのシーン全体がビューによって表示され、必要に応じてスクロールできるようになります。
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsRectItem>
#include <QGraphicsEllipseItem>
#include <QDebug> // デバッグ出力用
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
// 1. QGraphicsScene を作成
QGraphicsScene *scene = new QGraphicsScene();
// 2. シーンにアイテムを追加
// アイテム1: 矩形 (左上座標: -50, -50, 幅: 100, 高さ: 100)
QGraphicsRectItem *rectItem = new QGraphicsRectItem(-50, -50, 100, 100);
rectItem->setBrush(Qt::blue);
scene->addItem(rectItem);
// アイテム2: 円 (左上座標: 80, 80, 幅: 60, 高さ: 60)
QGraphicsEllipseItem *ellipseItem = new QGraphicsEllipseItem(80, 80, 60, 60);
ellipseItem->setBrush(Qt::red);
scene->addItem(ellipseItem);
// アイテム3: シーンのかなり外側に配置される矩形
QGraphicsRectItem *farItem = new QGraphicsRectItem(500, 500, 200, 200);
farItem->setBrush(Qt::green);
scene->addItem(farItem);
// シーンのアイテム境界矩形を確認
// この時点では、farItem も含めた全アイテムの境界矩形が計算されます。
qDebug() << "QGraphicsScene::itemsBoundingRect():" << scene->itemsBoundingRect();
// 3. QGraphicsView を作成し、シーンを設定
QGraphicsView *view = new QGraphicsView(scene);
// QGraphicsView の sceneRect は明示的に設定しない場合、
// QGraphicsScene::itemsBoundingRect() の値がデフォルトで使われます。
// そのため、ここでは特に view->setSceneRect() を呼び出す必要はありません。
// view->setSceneRect(scene->itemsBoundingRect()); // これは通常は自動で調整されるため不要だが、明示的に設定するならこのように記述
// スクロールバーの表示ポリシーを設定(必要に応じて表示)
view->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
view->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
view->setWindowTitle("Default QGraphicsView::sceneRect");
view->resize(400, 300); // ビューのサイズ
view->show();
// ビューが表示された後の QGraphicsView::sceneRect を確認
// デフォルトでは、QGraphicsScene::itemsBoundingRect() に一致するはずです。
qDebug() << "QGraphicsView::sceneRect() (after show):" << view->sceneRect();
return app.exec();
}
実行結果の考察
QGraphicsView
はデフォルトでこのscene->itemsBoundingRect()
を自身のsceneRect
として採用し、それに基づいてスクロールバーの範囲を決定します。そのため、ビューのサイズよりもシーンの範囲が大きい場合、スクロールバーが表示されます。farItem
がシーンのかなり外側に配置されているため、QGraphicsScene::itemsBoundingRect()
はこれらのすべてのアイテムを包含する大きな矩形を返します。
例2: QGraphicsView::sceneRect を明示的に設定する
この例では、QGraphicsScene
には広範囲にアイテムが存在するが、QGraphicsView
ではそのシーンの特定の領域のみを表示し、スクロールバーもその限定された領域に合わせる方法を示します。
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsRectItem>
#include <QDebug>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QGraphicsScene *scene = new QGraphicsScene();
// 広範囲にわたるアイテムを配置
for (int i = 0; i < 10; ++i) {
for (int j = 0; j < 10; ++j) {
QGraphicsRectItem *item = new QGraphicsRectItem(i * 100, j * 100, 80, 80);
item->setBrush(QColor(i * 25, j * 25, 100)); // 色を変えて視覚化
scene->addItem(item);
}
}
qDebug() << "QGraphicsScene::itemsBoundingRect():" << scene->itemsBoundingRect();
// この時点で scene->itemsBoundingRect() は (0,0, 1000, 1000) くらいの大きな矩形になるはずです。
QGraphicsView *view = new QGraphicsView(scene);
// QGraphicsView の sceneRect を明示的に設定
// シーン全体ではなく、(0,0)から(400,300)の範囲だけを表示するように制限
view->setSceneRect(0, 0, 400, 300);
// スクロールバーの表示ポリシーを設定
view->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
view->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
view->setWindowTitle("Custom QGraphicsView::sceneRect");
view->resize(400, 300);
view->show();
// ビューが表示された後の QGraphicsView::sceneRect を確認
// 明示的に設定した (0,0,400,300) に一致するはずです。
qDebug() << "QGraphicsView::sceneRect() (after show):" << view->sceneRect();
return app.exec();
}
実行結果の考察
- スクロールバーが表示されるのは、この設定された
view->sceneRect()
がビューポートのサイズ (400x300) よりも大きい場合です。この例ではビューポートと同じサイズなので、スクロールバーは表示されない可能性があります。もしビューポートが例えばview->resize(200, 150);
のように小さければ、スクロールバーが表示されます。 - しかし、
view->setSceneRect(0, 0, 400, 300);
と設定したため、ビューにはシーンの左上隅の 400x300 の範囲だけが表示されます。 - シーンには広大な範囲(1000x1000程度)にアイテムが配置されています。
例3: fitInView()
を使ってシーン全体をビューに収める
QGraphicsView::fitInView()
は、指定された矩形がビューポートに収まるようにビューをスケーリングし、移動する便利な関数です。これは、ビューの sceneRect
に合わせて自動的にビューの変換 (ズームとパン) を調整する場合によく使用されます。
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsRectItem>
#include <QDebug>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QGraphicsScene *scene = new QGraphicsScene();
// 広い範囲にアイテムを配置
for (int i = 0; i < 5; ++i) {
for (int j = 0; j < 5; ++j) {
QGraphicsRectItem *item = new QGraphicsRectItem(i * 200, j * 200, 150, 150);
item->setBrush(QColor(i * 50, j * 50, 200));
scene->addItem(item);
}
}
// シーンのアイテム境界矩形
QRectF sceneBoundingRect = scene->itemsBoundingRect();
qDebug() << "QGraphicsScene::itemsBoundingRect():" << sceneBoundingRect;
QGraphicsView *view = new QGraphicsView(scene);
// ビューのサイズを設定
view->resize(600, 400); // 広いシーンを小さなビューで表示する
// スクロールバーは表示しない設定にする (fitInViewを使うため)
view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// シーン全体をビューに収まるように調整
// Qt::KeepAspectRatio で縦横比を維持
view->fitInView(sceneBoundingRect, Qt::KeepAspectRatio);
// view->setSceneRect() はここでは明示的に設定しない
// fitInView() が内部でビューの変換行列を調整します。
view->setWindowTitle("QGraphicsView::fitInView Example");
view->show();
// fitInView() の後、QGraphicsView::sceneRect() はまだ QGraphicsScene::itemsBoundingRect() に一致します。
// fitInView() はビューの変換行列を操作することで、表示を調整しているためです。
qDebug() << "QGraphicsView::sceneRect() (after fitInView):" << view->sceneRect();
qDebug() << "QGraphicsView::transform():" << view->transform(); // 変換行列も確認すると良いでしょう
return app.exec();
}
- この場合、
QGraphicsView::sceneRect()
は、依然として関連付けられたQGraphicsScene
のsceneRect()
(またはitemsBoundingRect()
) と同じ値を返します。fitInView()
はsceneRect
を変更するのではなく、ビューの変換 (transform) を調整することで表示をコントロールしているためです。 fitInView()
を呼び出すことで、シーン内のすべてのアイテムがビューポート内に収まるように自動的にズームレベルとパンが調整されます。
QGraphicsScene::sceneRect を活用する
QGraphicsView::sceneRect
を明示的に設定しない場合、ビューはデフォルトで関連付けられている QGraphicsScene
の sceneRect()
を参照します。したがって、ビューの表示領域を制御する間接的な方法として、QGraphicsScene::sceneRect()
を操作することが挙げられます。
-
QGraphicsScene::itemsBoundingRect()
: シーン内のすべてのアイテムの現在の境界矩形を取得します。QGraphicsScene::sceneRect()
が明示的に設定されていない場合、この値がビューのデフォルトのスクロール範囲として使用されます。 用途:- シーン内のアイテムの実際の広さにビューを合わせたい場合。
- アイテムの動的な追加・削除に伴ってビューの範囲を自動調整したい場合。
-
QGraphicsScene::setSceneRect(const QRectF &rect)
: シーン自体の境界矩形を明示的に設定します。これにより、アイテムが存在しない領域を含めて、シーンの「広さ」を定義できます。特に、シーンにまだアイテムがない場合や、アイテムの境界矩形が不規則に変化する場合に有効です。 用途:- シーンの初期サイズを固定したい場合。
- 特定の描画領域を確保したい場合 (例: 背景画像やグリッドの描画範囲)。
- シーンのインデックス作成 (BSPツリーなど) のヒントとして使用する場合。
ビューの変換 (Transformations) を利用する
QGraphicsView
は、シーン座標系をビューポート座標系にマッピングするための変換行列 (Transform Matrix) を持っています。この変換行列を直接操作することで、ズーム、パン、回転などを制御し、表示されるシーンの領域を調整できます。これは sceneRect
の概念とは異なりますが、結果的にビューの表示内容を制御する強力な方法です。
QGraphicsView::translate(qreal dx, qreal dy)
: ビューを平行移動させます (パン操作)。QGraphicsView::rotate(qreal angle)
: ビューを回転させます。QGraphicsView::scale(qreal sx, qreal sy)
: ビューを現在のスケールからさらに拡大・縮小します。QGraphicsView::setTransform(const QTransform &matrix)
: ビューの現在の変換行列を設定します。これにより、シーンのズームレベル、回転、平行移動などを詳細に制御できます。
sceneRect との比較
sceneRect
は「シーンのどの領域を表示するか」という概念ですが、変換行列は「シーンをどのように表示するか (拡大・縮小、回転、移動)」という概念です。両者は密接に関連しており、fitInView()
のように、sceneRect
を引数にとって内部的に変換行列を調整する関数も存在します。
QGraphicsView::centerOn() を利用する
ビューの表示領域を特定のポイントやアイテムに合わせたい場合、centerOn()
を使用できます。これは sceneRect
を直接設定するのではなく、ビューの変換を調整して特定の位置を中央に配置します。
QGraphicsView::centerOn(const QGraphicsItem *item)
: 指定されたアイテムをビューポートの中央に配置します。QGraphicsView::centerOn(double x, double y)
: 上記のオーバーロード。QGraphicsView::centerOn(const QPointF &pos)
: シーン上の指定された点をビューポートの中央に配置します。
用途
- アプリケーションの起動時に特定の初期位置を表示したい場合。
- ユーザーが特定のアイテムをクリックした際に、そのアイテムを画面中央に移動させたい場合。
QGraphicsView::fitInView() を利用する
特定の矩形 (通常は QGraphicsScene::itemsBoundingRect()
やカスタムの矩形) をビューポート内に収まるように表示したい場合に非常に便利です。これも sceneRect
を直接変更するのではなく、ビューの変換行列を自動的に調整します。
QGraphicsView::fitInView(const QGraphicsItem *item, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio)
: 指定されたアイテムがビューポートに収まるように調整します。QGraphicsView::fitInView(const QRectF &rect, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio)
: 指定された矩形がビューポートに収まるようにビューをスケーリングし、移動します。aspectRatioMode
をQt::KeepAspectRatio
に設定することで、縦横比を維持できます。
用途
- ビューのリサイズ時に表示内容を自動調整したい場合 (
resizeEvent
で呼び出す)。 - 特定のアイテムを拡大表示したい場合。
- シーン全体のアイテムが常にビューポート内に収まるようにしたい場合。
QGraphicsView のスクロールバーポリシーを設定する
sceneRect
の設定はスクロールバーの範囲に影響を与えますが、スクロールバー自体の表示/非表示を制御する代替方法もあります。
QGraphicsView::setVerticalScrollBarPolicy(Qt::ScrollBarPolicy policy)
:Qt::ScrollBarAsNeeded
(デフォルト、必要に応じて表示)、Qt::ScrollBarAlwaysOn
(常に表示)、Qt::ScrollBarAlwaysOff
(常に非表示) などを設定できます。 用途:- スクロールバーを完全に無効にしたい場合 (例: カスタムのパン/ズーム機能を提供するビュー)。
- 常にスクロールバーを表示させたい場合。
QGraphicsView::setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy policy)
:
これらのマッピング関数は、ビューポート座標とシーン座標間の変換を行います。これにより、sceneRect
を直接変更しなくても、ビューポートの特定の領域がシーンのどの部分に対応するかを計算したり、その逆を行ったりできます。
QRect QGraphicsView::mapFromScene(const QRectF &rect)
: シーンの矩形をビューポート座標に変換します。QPoint QGraphicsView::mapFromScene(const QPointF &point)
: シーンの点をビューポート座標に変換します。QRectF QGraphicsView::mapToScene(const QRect &rect)
: ビューポートの矩形をシーン座標に変換します。QPointF QGraphicsView::mapToScene(const QPoint &point)
: ビューポートの点をシーン座標に変換します。
用途
- ビューポートに現在表示されているシーンの正確な矩形 (
visibleRect
のようなもの) を取得したい場合 (mapToScene(viewport()->rect())
)。 - マウスイベントの座標をシーン座標に変換して、アイテムとのインタラクションを処理する場合。