Почему не работает считывание координаты при нажатии мышкой по 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_())
