Tôi gặp một số khó khăn với QGraphicsView
và QGraphicsScene
. Khi tôi zoom/unzoom trong cảnh và tạo các mục bằng mousePressEvent, tôi có một offset ở vị trí. Làm thế nào điều này có thể tránh được?MousePressEvent, vị trí bù đắp trong QGraphicsView
event.pos()
có vẻ là vấn đề ..
from PyQt4 import QtCore, QtGui
class graphicsItem (QtGui.QGraphicsItem):
def __init__ (self):
super(graphicsItem, self).__init__()
self.rectF = QtCore.QRectF(0,0,10,10)
def boundingRect (self):
return self.rectF
def paint (self, painter=None, style=None, widget=None):
painter.fillRect(self.rectF, QtCore.Qt.red)
class graphicsScene (QtGui.QGraphicsScene):
def __init__ (self, parent=None):
super (graphicsScene, self).__init__ (parent)
class graphicsView (QtGui.QGraphicsView):
def __init__ (self, parent = None):
super (graphicsView, self).__init__ (parent)
self.parent = parent
def mousePressEvent(self, event):
super (graphicsView, self).mousePressEvent(event)
item = graphicsItem()
position = QtCore.QPointF(event.pos()) - item.rectF.center()
item.setPos(position.x() , position.y())
self.parent.scene.addItem(item)
def wheelEvent (self, event):
super (graphicsView, self).wheelEvent(event)
factor = 1.2
if event.delta() < 0 :
factor = 1.0/factor
self.scale(factor, factor)
class window (QtGui.QMainWindow):
def __init__ (self, parent = None) :
super (window, self).__init__(parent)
self.width = 800
self.height = 600
self.resize(self.width,self.height)
self.mainLayout = QtGui.QVBoxLayout(self)
self.view = graphicsView(self)
self.scene = graphicsScene(self)
self.view.setScene (self.scene)
factor = 1
self.scene.setSceneRect(0, 0, self.width * factor, self.height * factor)
self.view.setMinimumSize(self.width, self.height)
self.mainLayout.addWidget(self.view)
def show (self):
super (window, self).show()
Tôi thích giải pháp này và sẽ sử dụng nó bản thân mình. Nó giống như trong nội bộ có một mousePressEvent trên khung nhìn đồ họa và sau đó mapToScene vị trí chuột. Nhưng điều này là thanh lịch hơn. – Trilarion