【问题标题】:How to draw polyline with PyQt5 in Python?如何在 Python 中使用 PyQt5 绘制折线?
【发布时间】:2020-02-26 12:28:56
【问题描述】:

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

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_())

【问题讨论】:

    标签: python pyqt5 qpainter


    【解决方案1】:

    如果分析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_())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-30
      • 1970-01-01
      • 1970-01-01
      • 2016-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      相关资源
      最近更新 更多