账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    PyQt5中QGraphicsScene获取mousePressEvent事件鼠标位置全都为0.0
    43
    0

    问题描述

    PyQt5中,想在QGraphicsScene的mousePressEvent中获取鼠标位置,无论点哪,显示的都是[0.0,0.0]

    问题出现的环境背景及自己尝试过哪些方法

    网上没找到类似的问题

    相关代码

    // 请把代码文本粘贴到下方(请勿用图片代替代码)

    #这是继承QGraphicsScene的自定义类
    class CARscene(QtWidgets.QGraphicsScene):
        def __init__(self, parent=None):
            super(CARscene, self).__init__(parent)
    
        def mousePressEvent(self, QMouseEvent):
            #这行代码是期望显示坐标,奈何永远都是[0.0, 0.0]
            print([QMouseEvent.pos().x(), QMouseEvent.pos().y()])
    
    #这是主窗口的类,继承自QtDesigner设计的界面    
    class CDataMingQtUi(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(CDataMingQtUi, self).__init__()
        self.setupUi(self)
    
        #CARgraphview 是一个QGraphicView的实例
        self.figure = plt.figure()
        self.canvas = FigureCanvas(self.figure)
        self.graph_sence = CARscene()
        self.graph_sence.addWidget(self.canvas)
        self.CARgraphview.setScene(self.graph_sence)
        

    你期待的结果是什么?实际看到的错误信息又是什么?

    期待显示鼠标单击的坐标
    实际显示的确是[0.0, 0.0],无论点哪都是这个值

    2
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 寒闪图寒 普通会员 1楼

      在PyQt5中,QGraphicsScene类的mousePressEvent方法会处理鼠标按下和释放事件。如果这个方法的返回值是一个QGraphicsScene::MouseButtonEvent对象,其中鼠标按下事件的坐标是QVector2D对象,鼠标释放事件的坐标是QVector2D对象,那么QGraphicsScene::mousePressEvent方法将返回一个QVector2D对象,其x坐标和y坐标都是0.0,这是因为在窗口坐标系中,按下和释放事件的坐标都是相对于左上角的。

      要获取QGraphicsScene对象的鼠标按下事件的鼠标位置,可以使用以下代码:

      ```python import QGraphicsScene from PyQt5.QtWidgets import QApplication, QMainWindow, QGraphicsSceneMouseEvent

      class ExampleMainWindow(QMainWindow): def init(self): super().init() self.setScene(new QGraphicsScene())

          self.mouseDownButton = QGraphicsSceneMouseEvent(self, None, None, None, Qt.LeftButton, 0, 0)
          self.mouseDownButton.setScene(self.scene)
      
          self.connect(self.mouseDownButton, QtCore.SIGNAL("button_press_event(QGraphicsSceneMouseEvent*)"), self.on_mouse_down)
          self.connect(self.mouseDownButton, QtCore.SIGNAL("button_release_event(QGraphicsSceneMouseEvent*)"), self.on_mouse_release)
      
      def on_mouse_down(self, event):
          x = event.pos().x()
          y = event.pos().y()
          print(f"鼠标按下位置:({x:.2f}, {y:.2f})")
      
          self.scene.lockFocus()
          self.scene.mousePressEvent(QGraphicsSceneMouseEvent(self, event.pos(), event.pos(), event.pos(), Qt.LeftButton, 0, 0))
          self.scene.unlockFocus()
      
          self.mouseUpButton = QGraphicsSceneMouseEvent(self, None, None, None, Qt.LeftButton, 0, 0)
          self.mouseUpButton.setScene(self.scene)
      
          self.connect(self.mouseUpButton, QtCore.SIGNAL("button_press_event(QGraphicsSceneMouseEvent*)"), self.on_mouse_up)
          self.connect(self.mouseUpButton, QtCore.SIGNAL("button_release_event(QGraphicsSceneMouseEvent*)"), self.on_mouse_release)
      
      def on_mouse_up(self, event):
          x = event.pos().x()
          y = event.pos().y()
          print(f"鼠标释放位置:({x:.2f}, {y:.2f})")
      
          self.scene.lockFocus()
          self.scene.mouseReleaseEvent(QGraphicsSceneMouseEvent(self, event.pos(), event.pos(), event.pos(), Qt.LeftButton, 0, 0))
          self.scene.unlockFocus()
      
          self.mouseDownButton = QGraphicsSceneMouseEvent(self, None, None, None, Qt.LeftButton, 0, 0)
          self.mouseDownButton.setScene(self.scene)
      
          self.connect(self.mouseDownButton, QtCore.SIGNAL("button_press_event(QGraphicsSceneMouseEvent*)"), self.on_mouse_down)
          self.connect(self.mouseDownButton, QtCore.SIGNAL("button_release_event(QGraphicsSceneMouseEvent*)"), self.on_mouse_release)
      
      if __name__ == "__main__":
          app = QApplication([])
      
          exmw = ExampleMainWindow()
          exmw.show()
      
          app.exec_()
      

      ```

      在这个示例中,我们创建了一个QMainWindow类,其中包含一个QGraphicsScene对象。我们使用QGraphicsSceneMouseEvent类创建了两个鼠标按下和释放事件,分别位于窗口左上角。然后,我们获取了这两个事件的坐标,并打印出来。最后,我们获取了鼠标按下和释放事件的上下文,然后使用QGraphicsScene::mousePressEvent方法设置鼠标按下和释放事件的场景,并使用QGraphicsScene::mouseReleaseEvent方法设置鼠标按下和释放事件的场景。当鼠标按下或释放事件发生时,这些方法将被调用,从而获取鼠标按下或释放事件的坐标。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部