2

すべてのクライアント領域を取得するQGraphicsView内にQMainWindowsがあります。ビュー内で、いくつかのQGraphicsTextItemアイテムをレンダリングします。メインウィンドウのサイズを変更しない限り、すべてが機能します。そうすると、アイテムは元の位置に留まり、新しい正しい位置に移動しません。基本的に私がすることは、必要に応じて拡張するレイアウトウィジェットのような動作をすることです

更新1

ここに画像の説明を入力してください

更新2ここに画像の説明を入力してくださいここに画像の説明を入力してください

更新3

次のコードでは、ボタンはクライアント領域の右側に配置されています。944は、QGraphicsViewのQtDesignerから定義された幅です。エリアの左側にあるウィジェットにも同じコードがあり、xPosを10から開始し、新しいボタンを追加するたびにインクリメントします。ウィンドウのサイズを変更すると、左側のウィジェットは常に新しい位置に移動しますが、右側の動作は同じではありません。なんで?

this->ui.setupUi(this);

qreal xPos = 944 - 10;

QGraphicsTextItem *myButton1 = new QGraphicsTextItem("my text");

myButton1 ->adjustSize();
myButton1 ->setPos(xPos - myButton1 ->textWidth(), 10);

xPos -= myButton1 ->textWidth();

this->m_graphicsScene->addItem(myButton1);


QGraphicsTextItem *myButton2 = new QGraphicsTextItem("my text 2");

myButton2 ->adjustSize();
myButton2 ->setPos(xPos - myButton2->textWidth(), 10);

xPos -= myButton2 ->textWidth();

this->m_graphicsScene->addItem(myButton2);
4

1 に答える 1

3

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

于 2012-05-26T23:22:17.237 に答える