首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >鼠标在mouseMoveEvent和mousePressEvent中的位置不同: QGraphicsObject

鼠标在mouseMoveEvent和mousePressEvent中的位置不同: QGraphicsObject
EN

Stack Overflow用户
提问于 2018-05-02 06:04:16
回答 1查看 2.2K关注 0票数 1

在下面的示例中,鼠标在mouseMoveEvent和mousePressEvent中的位置是不同的。这是由于增加的缩放。没有缩放,位置是相同的。

我必须根据改变的比例更新boundingRect吗?多么?

代码语言:javascript
复制
#!/usr/bin/env python
from PyQt5.QtCore import (QRectF)
from PyQt5.QtGui import (QPainter, QPixmap)
from PyQt5.QtWidgets import (QMainWindow, QApplication, QGraphicsObject, QGraphicsView, QGraphicsScene)


class TicTacToe(QGraphicsObject):
    def __init__(self, helper):
        super(TicTacToe, self).__init__()
        self.mypixmap = QPixmap("exit1.png")

    def paint(self, painter, option, widget):
        painter.setOpacity(1)

        painter.drawPixmap(0,0, 512, 512, self.mypixmap)
        painter.drawLine(2,2,20,20)

    def boundingRect(self):
        return QRectF(0,0,512, 512)


    def keyPressEvent(self, event):
        print "aaaaaaaaaa"

    def mouseMoveEvent(self, event):
        print "ccccccccccc ", event.pos()

    def mousePressEvent(self, event):
        print "bbbbbbbbbbbb", event.pos()


class MyGraphicsView(QGraphicsView):
    def __init__(self):
        super(MyGraphicsView, self).__init__()
        self.scene = QGraphicsScene(self)

        self.tic_tac_toe = TicTacToe(self)

        self.myScale = 2
        self.tic_tac_toe.setScale(self.myScale)

        self.setScene(self.scene)
        self.scene.addItem(self.tic_tac_toe)
        self.setMouseTracking(True) 

    def keyPressEvent(self, event):
        self.tic_tac_toe.keyPressEvent(event)

    def mouseMoveEvent(self, event):
        print "mouse"        
        self.tic_tac_toe.mouseMoveEvent(event)


class Example(QMainWindow):    
    def __init__(self):
        super(Example, self).__init__()

        self.y = MyGraphicsView()
        self.setCentralWidget(self.y)


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    w = Example()
    w.show()
    sys.exit(app.exec_())
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-02 06:19:48

造成此问题的原因是将QGraphicsView事件发送到QGraphicsObject。在QGraphicsView的情况下,事件是QMouseEvent类型,而QGraphicsObject则是QGraphicsSceneMouseEvent类型。总之,您不应该将QGraphicsView事件传递给QGraphicsObject,因为它们引用的是具有不同信息的不同事件。

默认情况下,mousePressEvent事件是启用的,但在mouseMoveEvent事件的情况下,它不能由QGraphicsObject处理,相反,您必须使用hoverMoveEvent,但这些只能在QGraphicsObjectboundingRect中工作。

代码语言:javascript
复制
#!/usr/bin/env python
from PyQt5.QtCore import (QRectF)
from PyQt5.QtGui import (QPainter, QPixmap)
from PyQt5.QtWidgets import (QMainWindow, QApplication, QGraphicsObject, QGraphicsView, QGraphicsScene)


class TicTacToe(QGraphicsObject):
    def __init__(self, helper):
        super(TicTacToe, self).__init__()
        self.mypixmap = QPixmap("exit1.png")
        self.setAcceptHoverEvents(True)

    def paint(self, painter, option, widget):
        painter.setOpacity(1)
        painter.drawPixmap(0,0, 512, 512, self.mypixmap)
        painter.drawLine(2,2,20,20)

    def boundingRect(self):
        return QRectF(0,0,512, 512)

    def hoverMoveEvent(self, event):
        print("ccccccccccc ", event.pos())

    def mousePressEvent(self, event):
        print("bbbbbbbbbbbb", event.pos())


class MyGraphicsView(QGraphicsView):
    def __init__(self):
        super(MyGraphicsView, self).__init__()
        self.scene = QGraphicsScene(self)

        self.tic_tac_toe = TicTacToe(self)

        self.myScale = 2
        self.tic_tac_toe.setScale(self.myScale)

        self.setScene(self.scene)
        self.scene.addItem(self.tic_tac_toe)

class Example(QMainWindow):    
    def __init__(self):
        super(Example, self).__init__()

        self.y = MyGraphicsView()
        self.setCentralWidget(self.y)


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    w = Example()
    w.show()
    sys.exit(app.exec_())

另一方面,这些点与场景中的位置不一致,因为这些坐标是相对于项目的。

为了让你更好地理解,我们可以用下面的类比,假设你用相机记录一个场景,相机的屏幕就像QGraphicsView,场景是QGraphicsScene,演员是QGraphicsItemQGraphicsObject。每个元素都有一个不同的坐标系。

QGraphicsView的情况下,QMouseEvent返回以像素为单位的坐标,如果要将其转换为场景的坐标,则必须使用mapToScene()

QGraphicsItem/QGraphicsObject的情况下,与场景的坐标不同,这些坐标不受变换(如缩放、旋转等)的影响。这就是前面示例中打印的内容。如果你想把它转换成场景的单位,你必须使用mapToScene()

在下面的例子中,我展示了场景单位中的所有印象。

代码语言:javascript
复制
#!/usr/bin/env python
from PyQt5.QtCore import (QRectF)
from PyQt5.QtGui import (QPainter, QPixmap)
from PyQt5.QtWidgets import (QMainWindow, QApplication, QGraphicsObject, QGraphicsView, QGraphicsScene)


class TicTacToe(QGraphicsObject):
    def __init__(self, helper):
        super(TicTacToe, self).__init__()
        self.mypixmap = QPixmap("exit1.png")
        self.setAcceptHoverEvents(True)

    def paint(self, painter, option, widget):
        painter.setOpacity(1)
        painter.drawPixmap(0,0, 512, 512, self.mypixmap)
        painter.drawLine(2,2,20,20)

    def boundingRect(self):
        return QRectF(0,0,512, 512)

    def hoverMoveEvent(self, event):
        #print("hoverMoveEvent ", event.pos())
        print("hoverMoveEvent", self.mapToScene(event.pos()))

    def mousePressEvent(self, event):
        #print("mousePressEvent", event.pos())
        print("mousePressEvent", self.mapToScene(event.pos()))


class MyGraphicsView(QGraphicsView):
    def __init__(self):
        super(MyGraphicsView, self).__init__()
        self.scene = QGraphicsScene(self)
        self.setMouseTracking(True)

        self.tic_tac_toe = TicTacToe(self)

        self.myScale = 2
        self.tic_tac_toe.setScale(self.myScale)

        self.setScene(self.scene)
        self.scene.addItem(self.tic_tac_toe)

    def mouseMoveEvent(self, event):
        print("mouseMoveEvent", self.mapToScene(event.pos()))

class Example(QMainWindow):    
    def __init__(self):
        super(Example, self).__init__()
        self.y = MyGraphicsView()
        self.setCentralWidget(self.y)

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    w = Example()
    w.show()
    sys.exit(app.exec_())

如果需要更多信息,请检查以下链接:

  • http://doc.qt.io/qt-5/graphicsview.html
  • http://blog.qt.io/blog/2017/01/19/should-you-be-using-qgraphicsview/
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50128066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档