Graphics View フレームワーク
Graphics View は、多数のカスタム 2D グラフィック アイテムを管理・操作するための表面と、それらのアイテムを可視化するためのビューウィジェットを提供し、ズームや回転機能をサポートしています。
このフレームワークには、シーン上のアイテムに対して高精度な相互作用を可能にするイベント伝播アーキテクチャが含まれています。アイテムは、キーイベント、マウスの押下、移動、離し、ダブルクリックなどのイベントを処理できるほか、マウスの動きを追跡することもできます。
Graphics Viewは、BSP(バイナリ空間分割)ツリーを使用して非常に高速なアイテム検出を実現しており、その結果、数百万個のアイテムが存在する場合でも、大規模なシーンをリアルタイムで可視化することができます。
Graphics ViewはQt 4.2で導入され、その前身であるQCanvasに取って代わりました。
Graphics Viewのアーキテクチャ
Graphics View は、InterView の便利クラスであるQTableView 、QTreeView 、QListView と同様に、モデル・ビュープログラミングに対するアイテムベースのアプローチを提供します。複数のビューが 1 つのシーンを観察することができ、シーンにはさまざまな幾何学的形状のアイテムが含まれます。
Scene
QGraphicsScene は、Graphics Viewのシーンを提供します。シーンには以下の役割があります:
- 多数のアイテムを管理するための高速なインターフェースの提供
- 各アイテムへのイベントの伝播
- 選択やフォーカス処理などのアイテムの状態を管理すること
- (主に印刷用に)変換されていないレンダリング機能の提供
このシーンは、QGraphicsItem オブジェクトのコンテナとして機能します。アイテムはQGraphicsScene::addItem()を呼び出すことでシーンに追加され、その後、多数のアイテム検出関数のいずれかを呼び出すことで取得されます。QGraphicsScene::items()およびそのオーバーロードは、点、矩形、多角形、または一般的なベクトルパスに含まれる、またはそれらと交差するすべてのアイテムを返します。QGraphicsScene::itemAt() は、特定の点にある最上層のアイテムを返します。すべてのアイテム検出関数は、スタック順が降順でアイテムを返します(つまり、最初に返されるアイテムが最上層、最後のアイテムが最下層となります)。
QGraphicsScene scene;
QGraphicsRectItem *rect = scene.addRect(QRectF(0, 0, 100, 100));
QGraphicsItem *item = scene.itemAt(50, 50, QTransform());QGraphicsSceneのイベント伝播アーキテクチャは、シーンイベントをアイテムに配信するためのスケジューリングを行い、アイテム間の伝播も管理します。シーンが特定の位置でマウスクリックイベントを受信した場合、シーンはその位置にあるアイテムにイベントを転送します。
QGraphicsScene また、アイテムの選択やフォーカスといった特定のアイテム状態も管理します。任意の形状を引数としてQGraphicsScene::setSelectionArea()を呼び出すことで、シーン上のアイテムを選択できます。この機能は、QGraphicsView におけるラバーバンド選択の基礎としても使用されています。現在選択されているすべてのアイテムのリストを取得するには、QGraphicsScene::selectedItems()を呼び出します。QGraphicsScene が扱うもう1つの状態は、アイテムがキーボード入力フォーカスを有しているかどうかです。QGraphicsScene::setFocusItem() またはQGraphicsItem::setFocus() を呼び出すことで、アイテムにフォーカスを設定したり、QGraphicsScene::focusItem() を呼び出すことで現在のフォーカス先アイテムを取得したりできます。
最後に、QGraphicsScene を使用すると、QGraphicsScene::render() 関数を通じてシーンの一部をペイントデバイスにレンダリングすることができます。これについては、このドキュメントの後半にある「印刷」のセクションで詳しく説明しています。
View
QGraphicsView は、シーンの内容を可視化するビューウィジェットを提供します。同じシーンに複数のビューをアタッチすることで、同じデータセットに対して複数のビューポートを提供できます。ビューウィジェットはスクロール領域であり、大規模なシーン内を移動するためのスクロールバーを備えています。OpenGL サポートを有効にするには、QGraphicsView::setViewport() を呼び出して、QOpenGLWidget をビューポートとして設定します。
QGraphicsScene scene;
myPopulateScene(&scene);
QGraphicsView view(&scene);
view.show();ビューはキーボードやマウスからの入力イベントを受け取り、これらをシーンイベントに変換(必要に応じて座標をシーン座標に変換)してから、可視化されたシーンにイベントを送信します。
ビューは、変換行列 `QGraphicsView::transform()` を使用して、シーンの座標系を変換できます。これにより、ズームや回転などの高度なナビゲーション機能が可能になります。利便性を高めるため、QGraphicsView には、ビュー座標とシーン座標間の変換を行う関数 `QGraphicsView::mapToScene()` および `QGraphicsView::mapFromScene()` も用意されています。

Item
QGraphicsItem は、シーン内のグラフィカルアイテムの基底クラスです。Graphics View には、矩形 (QGraphicsRectItem)、楕円 (QGraphicsEllipseItem)、テキストアイテム (QGraphicsTextItem) など、一般的な形状に対応した標準アイテムがいくつか用意されていますが、QGraphicsItem の最も強力な機能は、カスタムアイテムを作成した際に利用できます。とりわけ、QGraphicsItem は以下の機能をサポートしています:
- マウスのクリック、移動、離し、ダブルクリックイベントに加え、マウスホバーイベント、ホイールイベント、コンテキストメニューイベントもサポートしています。
- キーボードのフォーカスおよびキーイベント
- ドラッグ&ドロップ
- グループ化(親子関係によるもの、およびQGraphicsItemGroup
- 衝突検出
アイテムはローカル座標系に存在し、QGraphicsView と同様に、アイテムとシーン間、およびアイテム間の座標をマッピングするための多くの関数も提供しています。また、QGraphicsView と同様に、行列を使用して座標系を変換することができます:QGraphicsItem::transform()。これは、個々のアイテムを回転させたり、拡大縮小したりするのに役立ちます。
アイテムは他のアイテム(子アイテム)を含むことができます。親アイテムの変換は、そのすべての子アイテムに継承されます。ただし、アイテムの累積変換にかかわらず、そのすべての関数(例:QGraphicsItem::contains()、QGraphicsItem::boundingRect()、QGraphicsItem::collidesWith())は、依然としてローカル座標系で動作します。
QGraphicsItem は、QGraphicsItem::shape() 関数および QGraphicsItem::collidesWith() 関数(いずれも仮想関数)による衝突検出をサポートしています。QGraphicsItem::shape() からアイテムの形状をローカル座標のQPainterPath として返すことで、QGraphicsItem がすべての衝突検出を自動的に処理します。 ただし、独自の衝突検出を実装したい場合は、QGraphicsItem::collidesWith()を再実装することができます。

Graphics View Framework のクラス
これらのクラスは、インタラクティブなアプリケーションを作成するためのフレームワークを提供します。
すべてのパスアイテムに共通のベース | |
QGraphicsAnchorLayout 内の 2 つのアイテム間のアンカーを表します。 | |
Graphics View において、ウィジェット同士をアンカーで固定できるレイアウト | |
すべてのGraphical Effectsの基底クラス | |
QGraphicsSceneに追加できる楕円アイテム | |
Graphics View 内のウィジェットを管理するためのグリッドレイアウト | |
QGraphicsScene内のすべてのグラフィック項目の基底クラス | |
一連のアイテムを単一のアイテムとして扱うコンテナ | |
Graphics View内のすべてのレイアウトの基底クラス | |
継承することで、カスタムアイテムをレイアウトで管理できるようにします | |
QGraphicsSceneに追加できるラインアイテム | |
Graphics View 内のウィジェットを管理するための水平または垂直レイアウト | |
シグナル、スロット、プロパティを必要とするすべてのグラフィック項目の基底クラス | |
QGraphicsSceneに追加できるパスアイテム | |
QGraphicsSceneに追加できるPixmapアイテム | |
QGraphicsScene に追加できるポリゴンアイテム | |
QGraphicsScene に QWidget を埋め込むためのプロキシレイヤー | |
QGraphicsSceneに追加できる矩形アイテム | |
多数の 2D グラフィック項目を管理するための Surface | |
グラフィックスビューフレームワークにおけるコンテキストメニューイベント | |
グラフィックスビューフレームワークにおけるドラッグ&ドロップのイベント | |
すべてのグラフィックスビュー関連イベントの基底クラス | |
ツールチップが要求された際のイベント | |
グラフィックスビューフレームワークにおけるホバーイベント | |
グラフィックスビューフレームワークにおけるマウスイベント | |
グラフィックスビューフレームワークにおけるウィジェットの移動に関するイベント | |
グラフィックスビューフレームワークにおけるウィジェットのサイズ変更に関するイベント | |
グラフィックスビューフレームワークにおけるホイールイベント | |
QGraphicsScene に追加できる単純なテキストアイテム | |
SVGファイルの内容を描画するために使用できるQGraphicsItem | |
書式設定されたテキストを表示するために QGraphicsScene に追加できるテキストアイテム | |
QGraphicsItem 上で高度な変換を構築するための抽象基底クラス | |
QGraphicsScene の内容を表示するためのウィジェット | |
QGraphicsScene内のすべてのウィジェット項目の基底クラス | |
QGraphicsItemを描画するために必要なパラメータを記述するために使用される |
グラフィックスビューの座標系
Graphics View はデカルト座標系に基づいており、シーン上のアイテムの位置と形状は、x 座標と y 座標という 2 つの数値の組み合わせで表されます。変換されていないビューでシーンを観察する場合、シーン上の 1 単位は画面上の 1 ピクセルに相当します。
注: Graphics View は Qt の座標系を使用しているため、Y 軸が 反転した座標系(y が上方向に向かうもの)は サポートされていません。
Graphics View では、アイテム座標、シーン座標、ビュー座標という 3 つの有効な座標系が使用されます。実装を簡略化するために、Graphics View では、これら 3 つの座標系間の変換を可能にする便利な関数が用意されています。
レンダリング時、Graphics View のシーン座標はQPainterの論理座標に対応し、ビュー座標はデバイス座標と同じになります。「座標系」のドキュメントでは、論理座標とデバイス座標の関係について確認できます。

アイテム座標
アイテムは、独自のローカル座標系に存在します。その座標は通常、中心点 (0, 0) を原点としており、ここがすべての変換の中心でもあります。アイテム座標系における幾何学的プリミティブは、しばしば「アイテム点」、「アイテム線」、「アイテム矩形」と呼ばれます。
カスタムアイテムを作成する際は、アイテム座標のみを考慮すれば十分です。QGraphicsScene およびQGraphicsView が、すべての変換を自動的に処理してくれます。これにより、カスタムアイテムの実装が非常に簡単になります。 たとえば、マウスのクリックやドラッグ・エンターイベントが発生した場合、イベントの位置はアイテム座標で指定されます。QGraphicsItem::contains() 仮想関数は、特定の点がアイテム内にある場合は `true ` を返し、そうでない場合は `false` を返しますが、この関数はアイテム座標での点を引数として受け取ります。同様に、アイテムのバウンディング矩形や形状もアイテム座標で指定されます。
項目の位置とは、その親の座標系における項目の中心点の座標を指し、親座標と呼ばれることもあります。この意味において、シーンは親を持たないすべての項目の「親」と見なされます。最上位の項目の位置はシーン座標で表されます。
子アイテムの座標は、親アイテムの座標を基準としています。子アイテムが変換されていない場合、子アイテムの座標と親アイテムの座標の差は、親アイテムの座標系における両アイテム間の距離と同じになります。例えば、変換されていない子アイテムが親アイテムの中心点に正確に位置している場合、両アイテムの座標系は同一になります。 しかし、子アイテムの位置が (10, 0) の場合、子アイテムの (0, 10) という点は、親アイテムの (10, 10) という点に対応することになります。
アイテムの位置と変形は親に対する相対的なものであるため、親の変形によって子アイテムの座標は影響を受けませんが、親の変形によって子は暗黙的に変形されます。 上記の例では、たとえ親が回転や拡大縮小されても、子要素の (0, 10) の点は依然として親の (10, 10) の点に対応します。しかし、シーンに対する相対的な位置では、子要素は親の変形と位置に従います。 親が(2x, 2x)にスケーリングされた場合、子アイテムの位置はシーン座標(20, 0)になり、その(10, 0)の点はシーン上の(40, 0)の点に対応します。
QGraphicsItem::pos() が数少ない例外の一つですが、QGraphicsItem の関数は、アイテムやその親の変換に関係なく、アイテム座標で動作します。例えば、アイテムのバウンディング矩形(QGraphicsItem::boundingRect())は、常にアイテム座標で指定されます。
シーン座標系
シーンは、その中のすべてのアイテムに対する基本座標系を表します。シーン座標系は、各トップレベルアイテムの位置を記述するだけでなく、ビューからシーンに配信されるすべてのシーンイベントの基礎ともなります。 シーン上の各アイテムは、ローカルなアイテムの位置やバウンディング矩形に加えて、シーン上の位置とバウンディング矩形(QGraphicsItem::scenePos(),QGraphicsItem::sceneBoundingRect())を持っています。シーン上の位置は、シーン座標系におけるアイテムの位置を表し、そのシーン上のバウンディング矩形は、QGraphicsScene がシーンのどの領域が変更されたかを判断するための基礎となります。 シーン内の変更は、QGraphicsScene::changed() シグナルを通じて通知され、引数にはシーン内の矩形のリストが渡されます。
ビュー座標
ビュー座標とは、ウィジェットの座標のことです。ビュー座標の各単位は 1 ピクセルに対応します。この座標系の特徴は、ウィジェット(またはビューポート)を基準としており、観察対象のシーンの影響を受けない点にあります。QGraphicsView のビューポートの左上隅は常に (0, 0) であり、右下隅は常に (ビューポートの幅, ビューポートの高さ) です。すべてのマウスイベントおよびドラッグ&ドロップイベントは、本来はビュー座標として受信されるため、アイテムと対話するためには、これらの座標をシーンにマッピングする必要があります。
座標のマッピング
シーン内のアイテムを扱う際、シーンからアイテムへ、アイテムからアイテムへ、あるいはビューからシーンへと、座標や任意の形状をマッピングすることが役立つ場合がよくあります。たとえば、QGraphicsView のビューポート内でマウスをクリックした際、QGraphicsView::mapToScene()を呼び出し、続いてQGraphicsScene::itemAt()を呼び出すことで、カーソルの下にあるアイテムがどれかをシーンに問い合わせることができます。 アイテムがビューポート内のどこに位置しているかを知りたい場合は、そのアイテムに対してQGraphicsItem::mapToScene()を呼び出し、続いてビューに対してQGraphicsView::mapFromScene()を呼び出します。最後に、ビューの楕円内にどのアイテムが含まれているかを確認したい場合は、QPainterPath をmapToScene()に渡した後、マップされたパスをQGraphicsScene::items()に渡します。
QGraphicsItem::mapToScene() およびQGraphicsItem::mapFromScene() を呼び出すことで、座標や形状をアイテムのシーンと相互に変換できます。また、QGraphicsItem::mapToParent() およびQGraphicsItem::mapFromParent() を呼び出すことでアイテムの親アイテムとの間、あるいはQGraphicsItem::mapToItem() およびQGraphicsItem::mapFromItem() を呼び出すことでアイテム間のマッピングを行うことも可能です。すべてのマッピング関数は、点、矩形、多角形、およびパスのいずれに対してもマッピングを行うことができます。
ビュー内でも、シーンとの間でマッピングを行うために、同じマッピング関数を使用できます。QGraphicsView::mapFromScene() およびQGraphicsView::mapToScene() です。ビューからアイテムへマッピングするには、まずシーンへマッピングし、次にシーンからアイテムへマッピングします。
主な機能
ズームと回転
QGraphicsView は、QPainter と同様に、QGraphicsView::setMatrix() を通じてアフィン変換をサポートしています。ビューに変換を適用することで、ズームや回転などの一般的なナビゲーション機能のサポートを簡単に追加できます。
以下は、QGraphicsView のサブクラスでズームおよび回転のスロットを実装する方法の例です:
class View : public QGraphicsView
{
Q_OBJECT
//...
public slots:
void zoomIn() { scale(1.2, 1.2); }
void zoomOut() { scale(1 / 1.2, 1 / 1.2); }
void rotateLeft() { rotate(-10); }
void rotateRight() { rotate(10); }
//...
};autoRepeat を有効にすることで、これらのスロットをQToolButtons に接続できます。
QGraphicsView これにより、ビューを変形する際にもビューの中心が位置合わせされた状態が維持されます。
基本的なズーム機能の実装方法を示すコードについては、「Elastic Nodes」の例も参照してください。
印刷
Graphics View は、そのレンダリング関数である `QGraphicsScene::render()` および `QGraphicsView::render()` を通じて、1 行単位の印刷機能を提供します。これらの関数は同じ API を提供します。いずれかのレンダリング関数に `QPainter ` を渡すことで、シーンまたはビューの内容の全部または一部を任意のペイントデバイスにレンダリングさせることができます。この例では、QPrinter を使用してシーン全体を 1 ページに印刷する方法を示します。
QGraphicsScene scene;
QPrinter printer;
scene.addRect(QRectF(0, 0, 100, 200), QPen(Qt::black), QBrush(Qt::green));
if (QPrintDialog(&printer).exec() == QDialog::Accepted) {
QPainter painter(&printer);
painter.setRenderHint(QPainter::Antialiasing);
scene.render(&painter);
}シーンとビューのレンダリング関数の違いは、一方がシーン座標系で動作し、もう一方がビュー座標系で動作する点にあります。QGraphicsScene::render()は、幾何学的データのプロットやテキスト文書の印刷など、シーンのセグメント全体を変換せずに印刷する場合によく使用されます。一方、QGraphicsView::render()はスクリーンショットの取得に適しており、デフォルトでは指定されたペインターを使用してビューポートの正確な内容をレンダリングします。
QGraphicsScene scene;
scene.addRect(QRectF(0, 0, 100, 200), QPen(Qt::black), QBrush(Qt::green));
QPixmap pixmap;
QPainter painter(&pixmap);
painter.setRenderHint(QPainter::Antialiasing);
scene.render(&painter);
painter.end();
pixmap.save("scene.png");ソース領域とターゲット領域のサイズが一致しない場合、ソースのコンテンツはターゲット領域に収まるように引き伸ばされます。使用しているレンダリング関数に `Qt::AspectRatioMode ` を渡すことで、コンテンツが引き伸ばされる際にシーンのアスペクト比を維持するか無視するかを選択できます。
ドラッグ&ドロップ
QGraphicsView は間接的にQWidget を継承しているため、QWidget が提供するのと同じドラッグ&ドロップ機能をすでに備えています。さらに、利便性を高めるため、Graphics Viewフレームワークはシーン全体および個々のアイテムごとにドラッグ&ドロップをサポートしています。ビューはドラッグを受け取ると、そのドラッグ&ドロップイベントをQGraphicsSceneDragDropEvent に変換し、それをシーンに転送します。 シーンはこのイベントのスケジューリングを引き継ぎ、マウスカーソルの下にあるドロップを受け入れる最初のアイテムにイベントを送信します。
アイテムからドラッグを開始するには、QDrag オブジェクトを作成し、ドラッグを開始するウィジェットへのポインタを渡します。 1つのアイテムは複数のビューから同時に監視されることがありますが、ドラッグを開始できるビューは1つだけです。ドラッグは、ほとんどの場合、マウスのクリックや移動によって開始されるため、`mousePressEvent()` または `mouseMoveEvent()` 内で、イベントからドラッグの起点となるウィジェットのポインタを取得できます。例:
void CustomItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
QMimeData *data = new QMimeData;
QDrag *drag = new QDrag(event->widget());
drag->setMimeData(data);
drag->exec();
}シーンのドラッグ&ドロップイベントをインターセプトするには、QGraphicsItem のサブクラス内で、QGraphicsScene::dragEnterEvent()およびそのシーンで必要なイベントハンドラを再実装します。Graphics Viewにおけるドラッグ&ドロップの詳細については、QGraphicsScene の各イベントハンドラのドキュメントを参照してください。
アイテムは、QGraphicsItem::setAcceptDrops() を呼び出すことで、ドラッグ&ドロップ機能を有効にできます。ドラッグ操作を処理するには、QGraphicsItem::dragEnterEvent()、QGraphicsItem::dragMoveEvent()、QGraphicsItem::dragLeaveEvent()、およびQGraphicsItem::dropEvent() を再実装します。
Graphics Viewによるドラッグ&ドロップ操作のサポートについては、「Drag and Drop Robot」のサンプルも参照してください。
カーソルとツールチップ
QWidget と同様に、QGraphicsItem もカーソル(QGraphicsItem::setCursor())およびツールチップ(QGraphicsItem::setToolTip())をサポートしています。カーソルとツールチップは、マウスカーソルが項目の領域に入った際に(QGraphicsItem::contains()の呼び出しによって検出され)、QGraphicsView によって有効化されます。
また、QGraphicsView::setCursor() を呼び出すことで、ビュー上で直接デフォルトのカーソルを設定することもできます。
ツールチップやカーソルの形状の処理を実装したコードについては、「Drag and Drop Robot」のサンプルも参照してください。
アニメーション
Graphics View は、いくつかのレベルでアニメーションをサポートしています。Animation Framework を使用することで、アニメーションを簡単に組み立てることができます。そのためには、アイテムが `QGraphicsObject ` を継承し、`QPropertyAnimation ` を関連付ける必要があります。`QPropertyAnimation ` を使用すると、QObject のプロパティをアニメーション化できます。
もう一つの選択肢は、QObject およびQGraphicsItem を継承するカスタムアイテムを作成することです。このアイテムは独自のタイマーを設定し、QObject::timerEvent() を使用してアニメーションを段階的に制御することができます。
3つ目の方法として、主にQt 3のQCanvasとの互換性を確保するために利用されるものとして、QGraphicsScene::advance()を呼び出してシーンを進め、その際にQGraphicsItem::advance()が自動的に呼び出される方法があります。
OpenGL レンダリング
OpenGLレンダリングを有効にするには、QGraphicsView::setViewport() を呼び出して、QGraphicsView のビューポートとして新しいQOpenGLWidget を設定するだけです。アンチエイリアシングを適用したOpenGLを使用する場合は、必要なサンプル数でQSurfaceFormat を設定する必要があります(QSurfaceFormat::setSamples() を参照)。
例:
QGraphicsView view(&scene);
QOpenGLWidget *gl = new QOpenGLWidget();
QSurfaceFormat format;
format.setSamples(4);
gl->setFormat(format);
view.setViewport(gl);アイテムグループ
あるアイテムを別のアイテムの子として設定することで、アイテムグループ化の最も重要な機能を実現できます。つまり、アイテムは一緒に移動し、すべての変形が親から子へと反映されます。
さらに、QGraphicsItemGroup は、子アイテムのイベント処理と、グループへのアイテムの追加・削除を行うための便利なインターフェースを組み合わせた特別なアイテムです。QGraphicsItemGroup にアイテムを追加すると、そのアイテムの元の位置と変形が保持されますが、一般的にアイテムの親を変更すると、子アイテムは新しい親を基準にして位置を再調整します。 利便性のため、QGraphicsScene::createItemGroup() を呼び出すことで、シーン内で `QGraphicsItemGroup` を作成することができます。
ウィジェットとレイアウト
XML および Qt Widgets では、Qt 4.4 では、QGraphicsWidget を通じて、ジオメトリおよびレイアウトを意識したアイテムのサポートが導入されました。この特別なベースアイテムはQWidget に似ていますが、QWidget とは異なり、QPaintDevice から継承するのではなく、QGraphicsItem から継承します。これにより、イベント、シグナルとスロット、サイズヒント、ポリシーを備えた完全なウィジェットを作成できるほか、QGraphicsLinearLayout およびQGraphicsGridLayout を通じて、レイアウト内のウィジェットのジオメトリを管理することもできます。
QGraphicsWidget
QGraphicsItem の機能と軽量なフットプリントを基盤として構築されたQGraphicsWidget は、両者の長所を兼ね備えています。すなわち、QWidget が提供するスタイル、フォント、パレット、レイアウト方向、およびジオメトリといった追加機能と、QGraphicsItem が提供する解像度独立性および変換のサポートです。Graphics Viewは整数ではなく実座標を使用するため、QGraphicsWidget のジオメトリ関数はQRectF やQPointF に対しても動作します。 これは、フレームの矩形、余白、および間隔にも当てはまります。QGraphicsWidget では、例えばコンテンツの余白を(0.5, 0.5, 0.5, 0.5)と指定することも珍しくありません。 サブウィジェットと「トップレベル」ウィンドウの両方を作成できます。場合によっては、高度なMDIアプリケーションにGraphics Viewを使用できるようになりました。
QWidget のプロパティの一部(ウィンドウフラグや属性など)はサポートされていますが、すべてではありません。何がサポートされ、何がサポートされていないかの完全な概要については、QGraphicsWidget のクラスドキュメントを参照してください。たとえば、QGraphicsWidget のコンストラクタにQt::Window ウィンドウフラグを渡すことで、装飾されたウィンドウを作成できますが、Graphics Viewは現在、macOSで一般的なQt::Sheet およびQt::Drawer フラグをサポートしていません。
QGraphicsLayout
QGraphicsLayout は、QGraphicsWidget 向けに特別に設計された第2世代のレイアウトフレームワークの一部です。そのAPIはQLayout のものと非常に似ています。QGraphicsLinearLayout およびQGraphicsGridLayout の内部で、ウィジェットやサブレイアウトを管理できます。また、QGraphicsLayout をサブクラス化して独自のレイアウトを簡単に作成したり、QGraphicsLayoutItem のアダプタサブクラスを記述して、独自のQGraphicsItem アイテムをレイアウトに追加したりすることもできます。
ウィジェットの埋め込みサポート
Graphics Viewは、あらゆるウィジェットをシーンに埋め込むためのシームレスなサポートを提供します。QLineEdit やQPushButton などの単純なウィジェットから、QTabWidget のような複雑なウィジェット、さらには完全なメインウィンドウまで埋め込むことができます。ウィジェットをシーンに埋め込むには、QGraphicsScene::addWidget()を呼び出すか、QGraphicsProxyWidget のインスタンスを作成して手動で埋め込むだけです。
QGraphicsProxyWidget を通じて、Graphics Viewは、カーソル、ツールチップ、マウス、タブレット、キーボードのイベント、子ウィジェット、アニメーション、ポップアップ(例:QComboBox やQCompleter )、およびウィジェットの入力フォーカスやアクティベーションなど、クライアントウィジェットの機能を深く統合することができます。QGraphicsProxyWidget さらに、埋め込みウィジェットのタブ順序も統合されているため、タブキーで埋め込みウィジェット間を移動できます。新しいQGraphicsView をシーンに埋め込んで、複雑なネストされたシーンを構築することも可能です。
埋め込みウィジェットを変形させる際、Graphics Viewはウィジェットが解像度非依存で変形されるように処理するため、ズームインしてもフォントやスタイルが鮮明に保たれます。(解像度非依存の効果はスタイルによって異なる点に注意してください。)
パフォーマンス
浮動小数点演算命令
アイテムへの変形やエフェクトを正確かつ迅速に適用するため、Graphics Viewは、ユーザーのハードウェアが浮動小数点演算に対して適切なパフォーマンスを発揮できることを前提に構築されています。
多くのワークステーションやデスクトップコンピュータには、この種の計算を高速化する適切なハードウェアが搭載されていますが、一部の組み込みデバイスでは、数学演算を処理するためのライブラリしか提供されていない場合や、ソフトウェアで浮動小数点演算をエミュレートしている場合があります。
その結果、特定のデバイスでは、特定のエフェクトの処理が予想より遅くなる場合があります。このパフォーマンスの低下は、他の領域(例えば、OpenGLを使用してシーンをレンダリングするなど)で最適化を行うことで補える可能性があります。ただし、そのような最適化自体も、浮動小数点演算用ハードウェアの存在に依存している場合、パフォーマンスの低下を招く可能性があります。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.