问题与的QGraphicsView的fitInView时ItemIgnoresTransformat

2019-09-23 11:14发布

虽然试图执行一个场面,商品尺寸没有改变,但项目之间的距离得到放大我遇到了这个问题,下面的代码绘制一个矩形和文本“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_()

任何解释将不胜感激!

Answer 1:

事实上,矩形不会消失。 但周围移动“奇怪”。

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)


文章来源: Issue with fitInView of QGraphicsView when ItemIgnoresTransformations is on