Используя PyQt5, как я могу соединить точки с линиями? - PullRequest
1 голос
/ 26 февраля 2020

Я могу поставить точки на экране, нажав, и я хочу соединить их линиями после каждого выбора точки. Как я могу добавить эту часть?

import sys
from PyQt5 import QtWidgets, QtGui, QtCore, uic


class GUI(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.setFixedSize(self.size())
        self.show()
        self.points = QtGui.QPolygon()

    def mousePressEvent(self, e):
        self.points << e.pos()
        self.update()

    def paintEvent(self, ev):
        qp = QtGui.QPainter(self)
        qp.setRenderHint(QtGui.QPainter.Antialiasing)
        pen = QtGui.QPen(QtCore.Qt.black, 5)
        brush = QtGui.QBrush(QtCore.Qt.black)
        qp.setPen(pen)
        qp.setBrush(brush)
        for i in range(self.points.count()):
            print(self.points.point(i))
            qp.drawEllipse(self.points.point(i), 5, 5) 
            # qp.drawPoints(self.points)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = GUI()
    sys.exit(app.exec_())

1 Ответ

0 голосов
/ 26 февраля 2020

Вы должны нарисовать линию между предыдущей точкой с текущей точкой:

def paintEvent(self, ev):
    qp = QtGui.QPainter(self)
    qp.setRenderHint(QtGui.QPainter.Antialiasing)
    pen = QtGui.QPen(QtCore.Qt.black, 5)
    brush = QtGui.QBrush(QtCore.Qt.black)
    qp.setPen(pen)
    qp.setBrush(brush)

    lp = QtCore.QPoint()
    for i in range(self.points.count()):
        cp = self.points.point(i)
        qp.drawEllipse(cp, 5, 5)
        if not lp.isNull():
            qp.drawLine(lp, cp)
        lp = cp

Другое подобное решение можно сделать с помощью QPainterPath:

class GUI(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.path = QtGui.QPainterPath()
        self.setFixedSize(self.size())
        self.show()

    def mousePressEvent(self, e):
        if self.path.elementCount() == 0:
            self.path.moveTo(e.pos())
        else:
            self.path.lineTo(e.pos())
        self.update()
        super().mousePressEvent(e)

    def paintEvent(self, ev):
        qp = QtGui.QPainter(self)
        qp.setRenderHint(QtGui.QPainter.Antialiasing)
        pen = QtGui.QPen(QtCore.Qt.black, 5)
        qp.setPen(pen)
        qp.drawPath(self.path)

        brush = QtGui.QBrush(QtCore.Qt.black)
        qp.setBrush(brush)

        for i in range(self.path.elementCount()):
            e = self.path.elementAt(i)
            qp.drawEllipse(QtCore.QPoint(e.x, e.y), 5, 5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...