Почему не работает считывание координаты при нажатии мышкой по scene?

Почему не работает считывание координаты при нажатии мышкой по scene?

 def mousePressEvent(self, event):

        x = event.scenePos().x()
        y = event.scenePos().y()
        print(x, y)

Ниже представлен весь код:

import sys
    from PyQt5 import QtWidgets
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    
    
    class Editor(QMainWindow):
        def __init__(self):
            super().__init__()
            self.state = ""
            self.resize(500, 500)
            self.setWindowTitle('GraphicsEditor')
    
            self.grview = QGraphicsView()
            self.scene = QGraphicsScene(self.grview)
            self.scene.setSceneRect(0, 0, 520, 520)
            self.grview.setScene(self.scene)
    
            self.pen = QPen(Qt.red)
            self.brush = QBrush(Qt.green)
    
            self.set_figure()
    
            self.trash_action.triggered.connect(self.clear)
            self.line_action.triggered.connect(self.click_line)
            self.rect_action.triggered.connect(self.click_rect)
            self.circle_action.triggered.connect(self.click_circle)
    
            self.centralWidget = QWidget()
            self.setCentralWidget(self.centralWidget)
            layout = QVBoxLayout(self.centralWidget)
            layout.addWidget(self.grview)
    
            self.show()
    
        def mousePressEvent(self, event):
            
            x = event.scenePos().x()
            y = event.scenePos().y()
            print(x, y)
            
            if self.state == "rect":
                rect = self.scene.addRect(100, 100,  100, 100, self.pen, self.brush)
                rect.setFlag(QGraphicsItem.ItemIsMovable)
            elif self.state == "circle":
                circle = self.scene.addEllipse(100, 100, 100, 100, self.pen, self.brush)
                circle.setFlag(QGraphicsItem.ItemIsMovable)
            elif self.state == "line":
                line = self.scene.addLine(10, 10, 100, 100, self.pen)
                line.setFlag(QGraphicsItem.ItemIsMovable)
            super(Editor, self).mousePressEvent(event)
    
        def mouseMoveEvent(self, event):
            print("mouse movement")
            super(Editor, self).mouseMoveEvent(event)
    
        def set_figure(self):
            self.figure_toolbar = QToolBar("figure")
            self.figure_toolbar.setIconSize(QSize(14, 14))
            self.basicToolBar = self.addToolBar(self.figure_toolbar)
            #кнопка line
            self.line_action = QAction(QIcon("images/line.png"), 'line', self)
            self.line_action.setStatusTip("line")
            self.figure_toolbar.addAction(self.line_action)
            #кнопка rectangle
            self.rect_action = QAction(QIcon("images/rect.png"), 'rectangle', self)
            self.rect_action.setStatusTip("rect")
            self.figure_toolbar.addAction(self.rect_action)
            #кнопка круг
            self.circle_action = QAction(QIcon("images/circle.ico"), 'circle', self)
            self.circle_action.setStatusTip("circle")
            self.figure_toolbar.addAction(self.circle_action)
            #кнопка select
            self.select_action = QAction(QIcon("images/select.ico"), 'select', self)
            self.select_action.setStatusTip("select")
            self.figure_toolbar.addAction(self.select_action)
            #кнопка очистки
            self.trash_action = QAction(QIcon("images/trash.png"), 'trash', self)
            self.trash_action.setStatusTip("trash")
            self.figure_toolbar.addAction(self.trash_action)
    
        def click_line(self):
            self.state = "line"
    
        def click_rect(self):
            self.state = "rect"
    
        def click_circle(self):
            self.state = "circle"
    
        def clear(self):
            self.scene.clear()
            
    def main():
        app = QtWidgets.QApplication(sys.argv)
        g = Editor()
        sys.exit(app.exec_())
    
    if __name__ == "__main__":
        main()

Ответы (1 шт):

Автор решения: S. Nick

С некоторыми разъяснениями по вашему вопросу можете ознакомиться здесь Cцена и предствление в pyqt5

Особое внимание обратите на то, что Графическое представление основано на декартовой системе координат, у представлений, сцен и примитивов есть свои собственные координаты.

import sys
import math                                                     ###
from PyQt5 import QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
class GraphicsScene(QGraphicsScene):
    clicked = pyqtSignal(QPointF)

    def drawBackground(self, painter, rect):
        l = min(rect.width(), rect.height()) / 30

        x_left = QPointF(rect.left(), 0)
        x_right = QPointF(rect.right(), 0)
        painter.drawLine(x_left, x_right)

        right_triangle = QPainterPath()
        right_triangle.lineTo(-0.5 * math.sqrt(3) * l, 0.5 * l)
        right_triangle.lineTo(-0.5 * math.sqrt(3) * l, -0.5 * l)
        right_triangle.closeSubpath()
        right_triangle.translate(x_right)

        painter.setBrush(QColor("black"))
        painter.drawPath(right_triangle)

        y_top = QPointF(0, rect.top())
        y_bottom = QPointF(0, rect.bottom())
        painter.drawLine(y_top, y_bottom)

        top_triangle = QPainterPath()
        top_triangle.lineTo(.5*l, -0.5 * math.sqrt(3) * l)
        top_triangle.lineTo(-.5*l, -0.5 * math.sqrt(3) * l)
        top_triangle.closeSubpath()
        top_triangle.translate(y_bottom)

        painter.setBrush(QColor("black"))
        painter.drawPath(top_triangle)

    def mousePressEvent(self, event):
        sp = event.scenePos()
        self.clicked.emit(sp)
        super().mousePressEvent(event)
#  +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        

class Editor(QMainWindow):
    def __init__(self):
        super().__init__()
        self.state = ""
        self.resize(520, 550)

        self.setWindowTitle('GraphicsEditor')

        self.grview = QGraphicsView()
        self.grview.scale(1, -1)                                       # +++
        
#        self.scene = QGraphicsScene(self.grview)                      # ---
        self.scene = GraphicsScene()                                   # +++
        self.scene.clicked.connect(self.handle_clicked)                # +++

#        self.scene.setSceneRect(0, 0, 500, 500)
        self.scene.setSceneRect(-250, -250, 500, 500)                  # +++
        
        self.grview.setScene(self.scene)

        self.pen = QPen(Qt.red)
        self.brush = QBrush(Qt.green)

        self.set_figure()

        self.trash_action.triggered.connect(self.clear)
        self.line_action.triggered.connect(self.click_line)
        self.rect_action.triggered.connect(self.click_rect)
        self.circle_action.triggered.connect(self.click_circle)

        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)
        layout = QVBoxLayout(self.centralWidget)
        layout.setContentsMargins(0, 0, 0, 0)                           # +
        layout.addWidget(self.grview)

        self.show()

    def mousePressEvent(self, event):
###        
#        x = event.scenePos().x()
#        y = event.scenePos().y()
#        print(x, y)
        print(f'event -> {event}, event.pos={event.pos()}') 
        
        if self.state == "rect":
            rect = self.scene.addRect(100, 100,  100, 100, self.pen, self.brush)
            rect.setFlag(QGraphicsItem.ItemIsMovable)
        elif self.state == "circle":
            circle = self.scene.addEllipse(100, 100, 100, 100, self.pen, self.brush)
            circle.setFlag(QGraphicsItem.ItemIsMovable)
        elif self.state == "line":
            line = self.scene.addLine(10, 10, 100, 100, self.pen)
            line.setFlag(QGraphicsItem.ItemIsMovable)
        super(Editor, self).mousePressEvent(event)

    def mouseMoveEvent(self, event):
        print("mouse movement")
        super(Editor, self).mouseMoveEvent(event)

    def set_figure(self):
        self.figure_toolbar = QToolBar("figure")
        self.figure_toolbar.setIconSize(QSize(14, 14))
        self.basicToolBar = self.addToolBar(self.figure_toolbar)
        #кнопка line
        self.line_action = QAction(QIcon("images/line.png"), 'line', self)
        self.line_action.setStatusTip("line")
        self.figure_toolbar.addAction(self.line_action)
        #кнопка rectangle
        self.rect_action = QAction(QIcon("images/rect.png"), 'rectangle', self)
        self.rect_action.setStatusTip("rect")
        self.figure_toolbar.addAction(self.rect_action)
        #кнопка круг
        self.circle_action = QAction(QIcon("images/circle.ico"), 'circle', self)
        self.circle_action.setStatusTip("circle")
        self.figure_toolbar.addAction(self.circle_action)
        #кнопка select
        self.select_action = QAction(QIcon("images/select.ico"), 'select', self)
        self.select_action.setStatusTip("select")
        self.figure_toolbar.addAction(self.select_action)
        #кнопка очистки
        self.trash_action = QAction(QIcon("images/trash.png"), 'trash', self)
        self.trash_action.setStatusTip("trash")
        self.figure_toolbar.addAction(self.trash_action)

    def click_line(self):
        self.state = "line"

    def click_rect(self):
        self.state = "rect"

    def click_circle(self):
        self.state = "circle"

    def clear(self):
        self.scene.clear()
# +++        
    def handle_clicked(self, p):                                       # +++
        print(f"clicked scene: x={p.x()}, y={p.y()}")                  # +++
        
        
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    g = Editor()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка