python - 如何在Python中使用PyQt5绘制折线?

标签 python pyqt5 qpainter

我想用鼠标事件绘制折线。但我无法通过单击来设置端点,或选择笔类型。我想绘制线性线,但是当我编写此代码时,它只显示点而不是绘制线。这是我的代码:

import sys
from PyQt5 import QtWidgets, QtCore
from PyQt5.QtGui import QPainter, QBrush, QColor, QPen, QPainterPath
from PyQt5.QtWidgets import QLabel, QGraphicsScene, QGraphicsView


class MyWidget(QtWidgets.QWidget):
def __init__(self):
    super().__init__()
    self.begin = QtCore.QPoint()
    self.end = QtCore.QPoint()
    self.beginList = []
    self.endList = []
    self.initUI()

def initUI(self):
    self.setGeometry(200, 200, 1000, 500)
    self.label = QLabel(self)
    self.label.resize(500, 40)
    self.show()

def paintEvent(self, event):
    qp = QPainter(self)
    for i,j in zip(self.beginList, self.endList):
        qp.drawLines(QtCore.QLineF(i,j))


def mouseMoveEvent(self, event):
    self.begin = event.pos()
    self.end = event.pos()
    self.beginList.append(self.begin)
    self.endList.append(self.end)
    self.label.setText('Coordinates: ( %d : %d )' % (event.x(), event.y()))
    self.update()

def mouseReleaseEvent(self, event):
    self.begin = event.pos()
    self.end = event.pos()

if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = MyWidget()
window.resize(800,600)
sys.exit(app.exec_())

最佳答案

如果分析OP代码,起点和终点重合,那么在同一位置的2个点之间画线时,只会画一个点。逻辑是将第 i 步得到的点与第 (i+1) 个点连接起来。

要执行上述操作,最简单的事情是使用 QPainterPath:

import sys
from PyQt5 import QtWidgets, QtGui, QtCore


class MyWidget(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.paths = []

    def initUI(self):
        self.setGeometry(200, 200, 1000, 500)
        self.label = QtWidgets.QLabel(self)
        self.show()

    def paintEvent(self, event):
        qp = QtGui.QPainter(self)
        for path in self.paths:
            qp.drawPath(path)

    def mousePressEvent(self, event):
        path = QtGui.QPainterPath()
        path.moveTo(event.pos())
        self.paths.append(path)
        super().mousePressEvent(event)

    def mouseMoveEvent(self, event):
        self.paths[-1].lineTo(event.pos())
        self.label.setText('Coordinates: ( %d : %d )' % (event.x(), event.y()))
        self.label.adjustSize()
        self.update()
        super().mouseMoveEvent(event)

    def mouseReleaseEvent(self, event):
        self.paths[-1].lineTo(event.pos())
        self.update()
        super().mouseReleaseEvent(event)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = MyWidget()
    window.resize(800, 600)
    sys.exit(app.exec_())

关于python - 如何在Python中使用PyQt5绘制折线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60413976/

相关文章:

python - 使用opencv检测曲线形状的中心

python - 按频率过滤字符串列表

python - 如何保存和恢复每个小部件实例唯一的小部件属性?

c++ - QPainter 或 QLabel 绘制 QPixmap 的成本较低

c++ - QPainter与Qt::AlignCenter不能正确居中文本

python - Scrapy:scrapy server需要一个项目,为什么?

python - Django中忘记密码的实现

python - 如何将具有一对多关系的2个SQLite表显示到一个QTableWidget中

python - raise_(​​) 函数被忽略

python - QPainter 点大小为 1 像素且无法更改