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