python - 如何在 Python 中使用 PyQt5 绘制折线?
问题描述
我想用鼠标事件绘制折线。但我无法通过单击或选择笔类型来设置端点。我想画直线,但是当我写这段代码时,它只显示点而不是画线。这是我的代码:
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_())
推荐阅读
- android - 谷歌地图从第一个多边形位置开始第二个多边形的多个多边形
- php - 当关系方法名称和外键前缀不同时,Laravel Nova BelongsTo 不起作用
- php - 如何在 Laravel 5.5 中使用 Carbon 2
- web3 - 网络初始化工作不正常?
- ios - 使用 Swift 4.2 从下到上在 UICollectionView 中添加单元格
- npm - 尝试安装 `apt-get install npm` 时,显示错误
- angular - Angular 4:将响应从 API 转换为 PDF
- c - 使用 XCB 的奇怪递归行为
- python - Dump 和 Zip 文件无法恢复 odoo 8,如何解决?
- android - 画六边形