五、PyQt5 之 绘图
#!/usr/bin/python # -*- coding:utf-8 -*- """ 绘图API:绘制文本 QPainter painter = QPainter() painter.begin() painter.drawText(...) painter.end() 必须在paintEvent事件方法中绘制各种元素 """ import sys from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtGui import QPainter, QColor, QFont from PyQt5.QtCore import Qt class DrawText(QWidget): def __init__(self): super(DrawText, self).__init__() self.setWindowTitle("绘制文本") self.resize(300, 200) self.text = "Python常规操作" def paintEvent(self, event): painter = QPainter(self) painter.begin(self) painter.setPen(QColor(150, 43, 5)) # RGB painter.setFont(QFont("SimSun", 25)) # 绘图区域,居中,绘制文本 painter.drawText(event.rect(), Qt.AlignCenter, self.text) painter.end() if __name__ == '__main__': app = QApplication(sys.argv) main = DrawText() main.show() sys.exit(app.exec_())
#!/usr/bin/python # -*- coding:utf-8 -*- """ 用像素点回执正弦曲线 -2PI -- 2PI drawPoint(x, y) """ import sys, math from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import Qt class DrawPoints(QWidget): def __init__(self): super(DrawPoints, self).__init__() self.resize(300, 300) self.setWindowTitle("在窗口上用像素点绘制2个周期的正弦曲线") # 重写paintEvent 方法, 该函数会自动调用 def paintEvent(self, event): painter = QPainter() # 画图开始 painter.begin(self) # 设置笔的颜色 painter.setPen(Qt.blue) # 获取窗口的尺寸 size = self.size() # 像素为1000 for i in range(1000): # 说是曲线,其实是画了1000个点,看上去有点像曲线 # 因为在 0-999中间取值, -1 + 2.0 * i / 1000 范围就是 -1 --- 1 的范围 # size.width() / 2.0 是将绘制原点挪到窗口宽度的中间 x = 100 * (-1 + 2.0 * i / 1000) + size.width() / 2.0 y = -50 * math.sin((x - size.width() / 2.0) * math.pi / 50) + size.height() / 2.0 # 绘制像素点 painter.drawPoint(x, y) # 画图结束 painter.end() if __name__ == '__main__': app = QApplication(sys.argv) main = DrawPoints() main.show() sys.exit(app.exec_())
#!/usr/bin/python # -*- coding:utf-8 -*- import sys import math from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import Qt class DrawMultiLine(QWidget): def __init__(self): super(DrawMultiLine, self).__init__() self.resize(300, 300) self.setWindowTitle("绘制不同类型的直线") # 重写paintEvent 方法, 该函数会自动调用 def paintEvent(self, event): painter = QPainter() # 画图开始 painter.begin(self) # 创建一个画笔 ,颜色, 粗细, 实线 pen = QPen(Qt.red, 3, Qt.SolidLine) painter.setPen(pen) painter.drawLine(20, 40, 250, 40) # 设置虚线 pen.setStyle(Qt.DashLine) painter.setPen(pen) painter.drawLine(20, 80, 250, 80) # 设置点划线 pen.setStyle(Qt.DashDotDotLine) painter.setPen(pen) painter.drawLine(20, 120, 250, 120) # 设置点线 pen.setStyle(Qt.DotLine) painter.setPen(pen) painter.drawLine(20, 160, 250, 160) pen.setStyle(Qt.DashDotDotLine) painter.setPen(pen) painter.drawLine(20, 200, 250, 200) # 设置自定义 pen.setStyle(Qt.CustomDashLine) pen.setDashPattern([1, 10, 5, 4]) # 设置每两个之间的间距 painter.setPen(pen) painter.drawLine(20, 240, 250, 240) # 画图结束 painter.end() if __name__ == '__main__': app = QApplication(sys.argv) main = DrawMultiLine() main.show() sys.exit(app.exec_())
#!/usr/bin/python # -*- coding:utf-8 -*- """ 可以绘制弧形,圆形,矩形,多边形,绘制图像 """ import sys from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * class DrawAll(QWidget): def __init__(self): super(DrawAll, self).__init__() self.resize(300, 600) self.setWindowTitle("绘制各种图形") def paintEvent(self, event): qp = QPainter() qp.begin(self) # 绘制弧形, 弧形在一个矩形范围内, 0,10 代表左上角坐标, 100,100: 宽度, 高度 rect = QRect(0, 10, 100, 100) qp.setPen(Qt.blue) # 绘制区域,起始角度, 结束角度, 单位是 alen = 1/16度 qp.drawArc(rect, 0, 45 * 16) # 绘制从 0 - 45 度 # 绘制圆形 qp.setPen(Qt.red) # 起始x位置, 起始y位置,宽度, 高度, 起始度数, 结束度数 qp.drawArc(120, 10, 100, 100, 0, 360 * 16) # 绘制带弦的弧 qp.drawChord(10, 120, 100, 100, 12, 130 * 16) # 绘制扇形 qp.drawPie(10, 240, 100, 100, 12, 130 * 16) # 绘制椭圆 起始想,起始y, 宽度, 高度。 要是宽度 = 高度 就是圆 qp.drawEllipse(120, 120, 150, 100) # 绘制五边形, 需要 5 个点 point1 = QPoint(140, 380) point2 = QPoint(270, 420) point3 = QPoint(290, 512) point4 = QPoint(290, 588) point5 = QPoint(200, 533) # 创建多边形对象 polygon = QPolygon([point1, point2, point3, point4, point5]) qp.drawPolygon(polygon) # 绘制图像 image = QImage("../images/python.png") # 绘制图像区域,是原图像的1/3 rect = QRect(10, 400, image.width()/3, image.height()/3) qp.drawImage(rect, image) qp.end() if __name__ == '__main__': app = QApplication(sys.argv) main = DrawAll() main.show() sys.exit(app.exec_())
#!/usr/bin/python # -*- coding:utf-8 -*- import sys from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * class FillRect(QWidget): def __init__(self): super(FillRect, self).__init__() self.resize(600, 600) self.setWindowTitle("用画刷填充区域") def paintEvent(self, event): qp = QPainter() qp.begin(self) # 创建画刷对象,默认是黑色实心的 brush = QBrush(Qt.SolidPattern) qp.setBrush(brush) qp.drawRect(10, 15, 90, 60) brush = QBrush(Qt.Dense1Pattern) qp.setBrush(brush) qp.drawRect(130, 15, 90, 60) brush = QBrush(Qt.Dense2Pattern) qp.setBrush(brush) qp.drawRect(250, 15, 90, 60) brush = QBrush(Qt.Dense3Pattern) qp.setBrush(brush) qp.drawRect(10, 105, 90, 60) brush = QBrush(Qt.HorPattern) qp.setBrush(brush) qp.drawRect(130, 105, 90, 60) qp.end() if __name__ == '__main__': app = QApplication(sys.argv) main = FillRect() main.show() sys.exit(app.exec_())