python - MousePressEvent,QGraphicsView中的位置偏移

标签 python qt pyqt pyside qgraphicsview

我在使用 QGraphicsViewQGraphicsScene 时遇到了一些困难。 当我在场景中缩放/取消缩放并使用 mousePressEvent 创建项目时,我在该位置有一个偏移量。如何避免这种情况?

event.pos() 似乎是问题所在..

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()  

最佳答案

在场景而不是 View 上重新实现 mousePressEvent

这样,event 参数将是一个 QGraphicsSceneMouseEvent ,它有几个有用的附加功能 - 包括 scenePos ,这正是你想要的:

class graphicsScene(QtGui.QGraphicsScene):
    def __init__ (self, parent=None):
        super(graphicsScene, self).__init__ (parent)

    def mousePressEvent(self, event):
        super(graphicsScene, self).mousePressEvent(event)
        item = graphicsItem()
        position = QtCore.QPointF(event.scenePos()) - item.rectF.center()
        item.setPos(position.x() , position.y())
        self.addItem(item)

关于python - MousePressEvent,QGraphicsView中的位置偏移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12249875/

相关文章:

python - 为项目选择合适的 GUI 框架

c++ - 如何让一个函数在 Qt 中暂时成为一个槽?

linux - 在 Windows 中字体显示为斜体,但在 Linux 中它始终显示为粗体

python - 如何在 PyQt4 中创建 QString?

python - 寻找火狐版本

c++ - dhclient 实时输出到 QlistWidget

python - 增加QtWebKit每台主机的最大连接数

c++ - 如何在 waf 构建系统中安装具有不同名称的库?

python - django manage.py migrate 命令是否创建数据库/模式(如果不存在)?

Python 多列表理解不起作用,如何正确地做到这一点?