QGraphicsView は、シーン内の QGraphicsItem オブジェクトに直接接続していません。その唯一の目的は、ビューポートでシーンのスライスを視覚化し、ユーザーの操作をシーンに送信することです。レイアウトはありませんが、QGraphicsWidget で使用するためにレイアウトが追加されました (ただし、これは特殊なケースです)。とにかく、これはシーン内のアイテムの位置とは対照的に、単にビューの移動に関連しています (互いに完全に無関係です)。
最も可能性が高いのは、QGraphicsView をサブクラス化し、ビューに resizeEvent を再実装することです: http://qt-project.org/doc/qt-4.8/qgraphicsview.html#resizeEvent
resizeEvent では、サイズ変更に基づく量によるビュー: http://qt-project.org/doc/qt-4.8/qgraphicsview.html#translate
基本的に、カスタム QGraphicsView 内に独自のレイアウト マネージャー機能を作成しています。
アップデート
SceneRect が QGraphicsView よりも大きい場合、スクロールバーが使用され、サイズ変更の中心にビューが保持されないことを理解しています。理想的には、コンテンツをスクロールする必要のない種類のグラフィック シーンを作成する場合は、sceneRect をデフォルトのままにするか、ビューポートのサイズに設定する必要があります。
それ以外の場合は、resizeEvent の使用方法の非常に基本的な例を次に示します。これは PyQt にありますが、翻訳できると確信しています。
class Dialog(QtGui.QDialog):
def __init__(self):
super(Dialog, self).__init__()
self.resize(640,480)
layout = QtGui.QVBoxLayout(self)
self.scene = QtGui.QGraphicsScene(self)
self.scene.setSceneRect(-500,-500,1000,1000)
self.view = GraphicsView(self)
self.view.setScene(self.scene)
layout.addWidget(self.view)
text = self.scene.addText("Foo")
self.view.updateCenter()
class GraphicsView(QtGui.QGraphicsView):
def __init__(self, parent=None):
super(GraphicsView, self).__init__(parent)
self._center = None
def resizeEvent(self, event):
super(GraphicsView, self).resizeEvent(event)
if self._center:
self.centerOn(self._center)
def updateCenter(self):
center = self.geometry().center()
self._center = self.mapToScene(center)
を呼び出すと、関心のあるシーン ポイントが保存されますupdateCenter()
。その後、ビューのサイズが変更されるたびに、そのシーン ポイントに中心が戻ります。
更新 2 : 写真の投稿と更新後
QGraphicsScene でこの種の通常の QWidget の動作が本当に必要な場合は、レイアウトをサポートする QGraphicsWidgets を検討する必要があります。次に、1 つの大きなルート「キャンバス」ウィジェットを作成し、レイアウト内で他のすべてをその子にすることができます。次に、ルート ウィジェットのサイズを適切に保つことだけを心配する必要があります。上記と同じ例を使用して、ルート ウィジェットのサイズと位置を管理できます。
QGraphicsItem をレイアウトに統合したいという同じ状況であるため、詳細についてはこの質問を参照してください:
QGraphicsWidget 対 QGraphicsLayoutItem