启用ItemIgnoresTransformations时,QGraphicsView的fitInView出现问题

时间:2012-10-03 17:07:05

标签: pyqt4 qgraphicsview

在尝试实现项目大小不变但场景之间的距离放大的场景时,我遇到了这个问题,下面的代码绘制了一个矩形和文本“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_()

任何解释都将不胜感激!

1 个答案:

答案 0 :(得分: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)