#python #pyqt5 #polyline #qgraphicsitem
#python #pyqt5 #полилиния #qgraphicsitem
Вопрос:
есть ли способ нарисовать линию с несколькими точками, а затем иметь возможность перехватить эту линию с помощью какого-либо события наведения курсора мыши?
К сожалению, я изо всех сил пытаюсь нарисовать линию в QGraphicsView с несколькими промежуточными точками.
Я знаю, как нарисовать замкнутый полигон QtWidgets.QGraphicsPolygonItem(QPolygonF...)
. Если мои полигональные точки не закрыты — это означает, что последняя точка не равна первой — полигон закрывается автоматически.
Однако я бы хотел не иметь этого последнего соединения.
QtWidgets.QGraphicsLineItem
Можно нарисовать только линию между двумя точками.
Ответ №1:
Одним из возможных решений является использование QPainterPath:
import random
from PyQt5 import QtGui, QtWidgets
class GraphicsPathItem(QtWidgets.QGraphicsPathItem):
def mousePressEvent(self, event):
super().mousePressEvent(event)
print("Local position:", event.pos())
print("Scene position:", event.scenePos())
def shape(self):
if self.path() == QtGui.QPainterPath():
return self.path()
pen = self.pen()
ps = QtGui.QPainterPathStroker()
ps.setCapStyle(pen.capStyle())
width = 2 * max(0.00000001, pen.widthF())
ps.setWidth(width)
ps.setJoinStyle(pen.joinStyle())
ps.setMiterLimit(pen.miterLimit())
return ps.createStroke(path)
app = QtWidgets.QApplication([])
scene = QtWidgets.QGraphicsScene()
view = QtWidgets.QGraphicsView(scene)
view.setRenderHint(QtGui.QPainter.Antialiasing)
view.resize(640, 480)
view.show()
path_item = GraphicsPathItem()
path_item.setPen(QtGui.QPen(QtGui.QColor("red"), 5))
path = QtGui.QPainterPath()
path.moveTo(0, 0)
for i in range(5):
x, y = random.sample(range(300), 2)
path.lineTo(x, y)
path_item.setPath(path)
scene.addItem(path_item)
app.exec_()
Ответ №2:
Я взял идею и использовал этот код:
path = QtGui.QPainterPath()
path.addPolygon(polyline)
new_item = QtWidgets.QGraphicsPathItem(path, None)
new_item.setPath(path)
scene.addItem(new_item)
У polyline
меня уже был QPolygonF-объект, содержащий все точки.