2

アイテムのサイズは変わらないがアイテム間の距離が拡大されるシーンを実装しようとしているときに、四角形とテキスト「A」を描画する次のコードでこの問題に遭遇しました。ここで、長方形の項目にフラグ ItemIgnoresTransformations を設定すると、ズームインすると長方形が消えます (長方形の周りでマウス ボタンをクリックしてドラッグします)。しかし、テキストの場合はそうはいきません。また、fitInView によって設定された新しいビューポート領域は、私が求めたものとは大きく異なります。

import sys
from PyQt4 import QtCore, QtGui

class GV(QtGui.QGraphicsView):
    def __init__(self, *args, **kwargs):
        QtGui.QGraphicsView.__init__(self, *args, **kwargs)

    def mousePressEvent(self, event):
        pos = QtCore.QPoint(event.pos())
        self.startPos = pos

    def mouseReleaseEvent(self, event):
        pos = QtCore.QPoint(event.pos())
        self.endPos = pos
        rect = QtCore.QRect(self.startPos, self.endPos) 
        sceneRect = self.mapToScene(rect).boundingRect()
        print 'Selected area: viewport coordinate:', rect, \
            ', scene coordinate:', sceneRect
        self.fitInView(sceneRect)
        print 'new viewport in scene coordinates:', \
            self.mapToScene(self.viewport().geometry()).boundingRect()

class Scene(QtGui.QGraphicsScene):
    def __init__(self, *args, **kwargs):
        QtGui.QGraphicsScene.__init__(self, *args, **kwargs)    
        self.itemA = QtGui.QGraphicsSimpleTextItem('A')
        self.itemA.setPos(20, 20)
        self.itemA.setFlag(QtGui.QGraphicsItem.ItemIgnoresTransformations, True)
        self.addItem(self.itemA)
        self.itemB = QtGui.QGraphicsRectItem(30, 50, 20, 20)
        self.addItem(self.itemB)
        self.itemB.setFlag(QtGui.QGraphicsItem.ItemIgnoresTransformations, True)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    widget = QtGui.QMainWindow()
    scene = Scene()
    view = GV(scene, widget)
    widget.setCentralWidget(view)
    widget.show()
    app.exec_()

説明をいただければ幸いです。

4

1 に答える 1

3

実際、長方形は消えません。しかし、それは「奇妙に」動き回ります。

self.itemB = QtGui.QGraphicsRectItem(30, 50, 20, 20)

この行は、あなたが望むものではないかもしれません。(30, 50)これにより、アイテムが作成され、ローカル座標から始まる長方形/正方形が配置されます。次に、これをシーンに追加します。これにより、 に固定されたアイテムが得られ(0, 0)、範囲は まで広がります(50, 70)が、長方形は右下にのみ描画され20x20ます。

を設定するItemIgnoresTransformationsと、アイテムはズームの場合に通常の変形を行うことができません。アイテムがこの変換を無視するために、シーンがズームインします。それ自体が一種の「縮小」します。しかし、それはまだ固定されて(0, 0)おり、長方形は右下にあるため、描画された長方形は左上に向かって移動します。

解決策はかなり単純です。長方形をローカル座標で作成しないでください。つまり、長方形を開始し(0, 0)、明示的に配置する必要があります。これは次のようになります。

self.itemB = QtGui.QGraphicsRectItem(0, 0, 20, 20)
self.itemB.setPos(30, 50)
于 2012-10-07T04:46:05.863 に答える