Painting in PyQt5

PyQt5 绘画系统能够渲染矢量图形、图像和基于轮廓字体的文本。当我们想要更改或增强现有小部件时,或者如果我们从头开始创建自定义小部件时,应用程序中需要绘画。为了进行绘图,我们使用 PyQt5 工具包提供的绘图 API。

QPainter

QPainter 在小部件和其他绘画设备上执行低级绘画。它可以绘制从简单线条到复杂形状的所有内容。

The paintEvent method

绘画是在paintEvent 方法中完成的。绘画代码位于 QPainter 对象的开始和结束方法之间。它在小部件和其他绘画设备上执行低级绘画。

PyQt5 draw text

我们首先在窗口的客户区绘制一些 Unicode 文本。

draw_text.py

#!/usr/bin/python"""
ZetCode PyQt5 tutorialIn this example, we draw text in Russian Cylliric.Author: Jan Bodnar
Website: zetcode.com
"""import sys
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QColor, QFont
from PyQt5.QtCore import Qtclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.text = "Лев Николаевич Толстой\nАнна Каренина"self.setGeometry(300, 300, 350, 300)self.setWindowTitle('Drawing text')self.show()def paintEvent(self, event):qp = QPainter()qp.begin(self)self.drawText(event, qp)qp.end()def drawText(self, event, qp):qp.setPen(QColor(168, 34, 3))qp.setFont(QFont('Decorative', 10))qp.drawText(event.rect(), Qt.AlignCenter, self.text)def main():app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())if __name__ == '__main__':main()

在我们的示例中,我们用 Cylliric 绘制了一些文本。文本垂直和水平对齐。

def paintEvent(self, event):
...

Drawing is done within the paint event.

qp = QPainter()
qp.begin(self)
self.drawText(event, qp)
qp.end()

QPainter 类负责所有低级绘画。所有的绘画方法都在开始方法和结束方法之间进行。实际的绘画被委托给 drawText 方法。

qp.setPen(QColor(168, 34, 3))
qp.setFont(QFont('Decorative', 10))

在这里,我们定义了用于绘制文本的笔和字体。

qp.drawText(event.rect(), Qt.AlignCenter, self.text)

drawText 方法在窗口上绘制文本。绘制事件的 rect 方法返回需要更新的矩形。使用 Qt.AlignCenter,我们可以在两个维度上对齐文本。

Figure: Drawing text

PyQt5 draw points

点是可以绘制的最简单的图形对象。这是窗户上的一个小地方。

draw_points.py

#!/usr/bin/python"""
ZetCode PyQt5 tutorialIn the example, we draw randomly 1000 red points
on the window.Author: Jan Bodnar
Website: zetcode.com
"""from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter
from PyQt5.QtCore import Qt
import sys, randomclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setGeometry(300, 300, 300, 190)self.setWindowTitle('Points')self.show()def paintEvent(self, e):qp = QPainter()qp.begin(self)self.drawPoints(qp)qp.end()def drawPoints(self, qp):qp.setPen(Qt.red)size = self.size()if size.height() <= 1 or size.height() <= 1:returnfor i in range(1000):x = random.randint(1, size.width() - 1)y = random.randint(1, size.height() - 1)qp.drawPoint(x, y)def main():app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())if __name__ == '__main__':main()

在我们的示例中,我们在窗口的客户区随机绘制 1000 个红点。

qp.setPen(Qt.red)

我们将笔设置为红色。我们使用预定义的 Qt.red 颜色常数。

size = self.size()

每次我们调整窗口大小时,都会生成一个绘制事件。我们使用 size 方法获取窗口的当前大小。我们使用窗口的大小将点分布在窗口的客户区。

qp.drawPoint(x, y)

We draw the point with the drawPoint method.

正在上传…重新上传取消

Figure: Points

PyQt5 colours

颜色是表示红色、绿色和蓝色 (RGB) 强度值组合的对象。有效的 RGB 值在 0 到 255 的范围内。我们可以通过多种方式定义颜色。最常见的是 RGB 十进制值或十六进制值。我们还可以使用代表红色、绿色、蓝色和 Alpha 的 RGBA 值。在这里,我们添加了一些关于透明度的额外信息。 Alpha 值 255 定义完全不透明度,0 表示完全透明,例如颜色是看不见的。

colours.py

#!/usr/bin/python"""
ZetCode PyQt5 tutorialThis example draws three rectangles in three
different colours.Author: Jan Bodnar
Website: zetcode.com
"""from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QColor, QBrush
import sysclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setGeometry(300, 300, 350, 100)self.setWindowTitle('Colours')self.show()def paintEvent(self, e):qp = QPainter()qp.begin(self)self.drawRectangles(qp)qp.end()def drawRectangles(self, qp):col = QColor(0, 0, 0)col.setNamedColor('#d4d4d4')qp.setPen(col)qp.setBrush(QColor(200, 0, 0))qp.drawRect(10, 15, 90, 60)qp.setBrush(QColor(255, 80, 0, 160))qp.drawRect(130, 15, 90, 60)qp.setBrush(QColor(25, 0, 90, 200))qp.drawRect(250, 15, 90, 60)def main():app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())if __name__ == '__main__':main()

在我们的示例中,我们绘制了三个彩色矩形。

color = QColor(0, 0, 0)
color.setNamedColor('#d4d4d4')

在这里,我们使用十六进制表示法定义颜色。

qp.setBrush(QColor(200, 0, 0))
qp.drawRect(10, 15, 90, 60)

这里我们定义一个画笔并绘制一个矩形。画笔是用于绘制形状背景的基本图形对象。 drawRect 方法接受四个参数。前两个是轴上的 x 和 y 值。第三个和第四个参数是矩形的宽度和高度。该方法使用当前的笔和画笔绘制矩形。

转存失败重新上传取消

Figure: Colours

PyQt5 QPen

QPen 是一个基本的图形对象。它用于绘制矩形、椭圆、多边形或其他形状的直线、曲线和轮廓。

pens.py

#!/usr/bin/python"""
ZetCode PyQt5 tutorialIn this example we draw 6 lines using
different pen styles.Author: Jan Bodnar
Website: zetcode.com
"""from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QPen
from PyQt5.QtCore import Qt
import sysclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setGeometry(300, 300, 280, 270)self.setWindowTitle('Pen styles')self.show()def paintEvent(self, e):qp = QPainter()qp.begin(self)self.drawLines(qp)qp.end()def drawLines(self, qp):pen = QPen(Qt.black, 2, Qt.SolidLine)qp.setPen(pen)qp.drawLine(20, 40, 250, 40)pen.setStyle(Qt.DashLine)qp.setPen(pen)qp.drawLine(20, 80, 250, 80)pen.setStyle(Qt.DashDotLine)qp.setPen(pen)qp.drawLine(20, 120, 250, 120)pen.setStyle(Qt.DotLine)qp.setPen(pen)qp.drawLine(20, 160, 250, 160)pen.setStyle(Qt.DashDotDotLine)qp.setPen(pen)qp.drawLine(20, 200, 250, 200)pen.setStyle(Qt.CustomDashLine)pen.setDashPattern([1, 4, 5, 4])qp.setPen(pen)qp.drawLine(20, 240, 250, 240)def main():app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())if __name__ == '__main__':main()

在我们的示例中,我们绘制了六条线。这些线条是用六种不同的笔样式绘制的。有五种预定义的笔样式。我们还可以创建自定义笔样式。最后一行是使用自定义笔样式绘制的。

pen = QPen(Qt.black, 2, Qt.SolidLine)

我们创建一个 QPen 对象。颜色是黑色。宽度设置为 2 像素,以便我们可以看到笔样式之间的差异。 Qt.SolidLine 是预定义的笔样式之一。

pen.setStyle(Qt.CustomDashLine)
pen.setDashPattern([1, 4, 5, 4])
qp.setPen(pen)

这里我们定义了一个自定义的笔样式。我们设置 Qt.CustomDashLine 笔样式并调用 setDashPattern 方法。数字列表定义了一种风格。必须有偶数个数。奇数定义一个破折号,偶数空间。数字越大,空格或破折号越大。我们的模式是 1 px dash、4 px space、5 px dash、4 px space 等。

Figure: Pen styles

PyQt5 QBrush

QBrush 是一个基本的图形对象。它用于绘制图形形状的背景,例如矩形、椭圆或多边形。画笔可以是三种不同的类型:预定义画笔、渐变或纹理图案。

brushes.py

#!/usr/bin/python"""
ZetCode PyQt5 tutorialThis example draws nine rectangles in different
brush styles.Author: Jan Bodnar
Website: zetcode.com
"""from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QBrush
from PyQt5.QtCore import Qt
import sysclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setGeometry(300, 300, 355, 280)self.setWindowTitle('Brushes')self.show()def paintEvent(self, e):qp = QPainter()qp.begin(self)self.drawBrushes(qp)qp.end()def drawBrushes(self, qp):brush = QBrush(Qt.SolidPattern)qp.setBrush(brush)qp.drawRect(10, 15, 90, 60)brush.setStyle(Qt.Dense1Pattern)qp.setBrush(brush)qp.drawRect(130, 15, 90, 60)brush.setStyle(Qt.Dense2Pattern)qp.setBrush(brush)qp.drawRect(250, 15, 90, 60)brush.setStyle(Qt.DiagCrossPattern)qp.setBrush(brush)qp.drawRect(10, 105, 90, 60)brush.setStyle(Qt.Dense5Pattern)qp.setBrush(brush)qp.drawRect(130, 105, 90, 60)brush.setStyle(Qt.Dense6Pattern)qp.setBrush(brush)qp.drawRect(250, 105, 90, 60)brush.setStyle(Qt.HorPattern)qp.setBrush(brush)qp.drawRect(10, 195, 90, 60)brush.setStyle(Qt.VerPattern)qp.setBrush(brush)qp.drawRect(130, 195, 90, 60)brush.setStyle(Qt.BDiagPattern)qp.setBrush(brush)qp.drawRect(250, 195, 90, 60)def main():app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())if __name__ == '__main__':main()

在我们的示例中,我们绘制了九个不同的矩形。

brush = QBrush(Qt.SolidPattern)
qp.setBrush(brush)
qp.drawRect(10, 15, 90, 60)

我们定义一个画笔对象。我们将其设置为画家对象并通过调用 drawRect 方法绘制矩形。

正在上传…重新上传取消

Figure: Brushes

Bézier curve

贝塞尔曲线是一条三次线。 PyQt5 中的贝塞尔曲线可以使用 QPainterPath 创建。画家路径是由许多图形构建块组成的对象,例如矩形、椭圆、直线和曲线。

bezier_curve.py

#!/usr/bin/python"""
ZetCode PyQt5 tutorialThis program draws a Bézier curve with
QPainterPath.Author: Jan Bodnar
Website: zetcode.com
"""import sysfrom PyQt5.QtGui import QPainter, QPainterPath
from PyQt5.QtWidgets import QWidget, QApplicationclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setGeometry(300, 300, 380, 250)self.setWindowTitle('Bézier curve')self.show()def paintEvent(self, e):qp = QPainter()qp.begin(self)qp.setRenderHint(QPainter.Antialiasing)self.drawBezierCurve(qp)qp.end()def drawBezierCurve(self, qp):path = QPainterPath()path.moveTo(30, 30)path.cubicTo(30, 30, 200, 350, 350, 30)qp.drawPath(path)def main():app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())if __name__ == '__main__':main()

This example draws a Bézier curve.

path = QPainterPath()
path.moveTo(30, 30)
path.cubicTo(30, 30, 200, 350, 350, 30)

我们使用 QPainterPath 路径创建贝塞尔曲线。曲线是使用cubicTo 方法创建的,该方法需要三个点:起点、控制点和终点。

qp.drawPath(path)

最终路径是使用 drawPath 方法绘制的。

转存失败重新上传取消

Figure: Bézier curve

pyqt5教程11:绘制外观相关推荐

  1. 第11课 Altium Designer20(AD20)+VESC6.4实战教程:绘制原理图8(北冥有鱼)

    第11课 Altium Designer20(AD20)+VESC6.4实战教程:绘制原理图8(北冥有鱼)

  2. matlab设计菜单教程,MATLAB程序设计教程(11)——MATLAB图形用户界面设计

    MATLAB程序设计教程(11)--MATLAB图形用户界面设计 第11章  MATLAB图形用户界面设计 11.1  菜单设计 11.2  对话框设计 11.3  图形用户界面设计工具 11.1菜单 ...

  3. ai怎么让图片任意变形_AI入门基础教程-图形绘制变形及路径查找器

    原标题:AI入门基础教程-图形绘制变形及路径查找器 l 新建: l 界面: 多个预编辑区: l 存储格式: 1. .AI :AI软件默认的存储格式,相当于PS的PSD格式 2. .EPS:使用AI软件 ...

  4. matlab对话框设计,MATLAB程序设计教程(11)——MATLAB图形用户界面设计

    MATLAB程序设计教程(11)--MATLAB图形用户界面设计 第11章  MATLAB图形用户界面设计 11.1  菜单设计 11.2  对话框设计 11.3  图形用户界面设计工具 11.1菜单 ...

  5. PyQt5 教程 《绘画》

    目录 在PyQt5中绘画 QPainter的 paintEvent方法 绘图文字 绘图点 颜色 QPEN QBrush Bézier曲线 在PyQt5中绘画 PyQt5绘画系统能够渲染矢量图形,图像和 ...

  6. PyQt5教程(十二)——实现QQ登录界面(六、实现鼠标拖动界面,鼠标事件)

    PyQt5教程(十二)--实现QQ登录界面(五.实现鼠标拖动界面,鼠标事件) 一.实现界面可以随着鼠标进行拖动 1.主要就是对鼠标事件的实现: def mousePressEvent(self, ev ...

  7. python读法1002python读法-Python教程之绘制Mandelbrot集合

    原标题:Python教程之绘制Mandelbrot集合 一. 分形与混沌 自然界的很多事物,如树木.云彩.山脉.雪花.海岸线等,都呈现出传统几何学所不能描述的形状,这些形状都有如下的特性: 有着十分精 ...

  8. 黑马lavarel教程---11、响应处理

    黑马lavarel教程---11.响应处理 一.总结 一句话总结: 如果在昂扬状态,看学习视频和运动时间重合,会很舒服 1.jquery的$.post参数为什么不需要占位? 因为每个参数的类型不同,可 ...

  9. STM32 电机教程 11 - BLDC 6 步方波开环速度控制

    前言 无刷直流 (Brushless Direct Current, BLDC)电机是一种正快速普及的电机类型,它可在家用电器.汽车.航空航天.消费品.医疗.工业自动化设备和仪器等行业中使用.正如名称 ...

最新文章

  1. 关于C#中async/await中的异常处理(上)
  2. 如何让EasyUI弹出层跳出框架
  3. adminLTE 教程 -4 轮播控件
  4. 精心挑选的23款美轮美奂的 jQuery 图片特效插件
  5. python日期迭代_计算敏捷项目中迭代时间安排(Python3版)
  6. python3自动化软件发布系统_基于python3做C/S端自动化测试可能用到的工具(不断更新中。。。。)...
  7. es-03-DSL的简单使用
  8. 基于模板的通用代码生成器LKGenerator(四)-核心技术之各种数据库查询表信息sql整理...
  9. GDAL C# “OSGeo.GDAL.GdalPINVOKE”的类型初始值设定项引发异常 解决方法
  10. php判断长度函数是,php判断字符串长度 strlen()与mb_strlen()函数
  11. Cisco 证书查询
  12. springboot 问卷调查系统
  13. Go 每日一库之 roaring
  14. 三菱电梯开门键一直亮_电梯反复开关门是什么原因?
  15. [usaco2010 Oct]Soda Machine (入门oj Problem 6195 )
  16. mysql修复损坏表_在MySQL中,如何修复损坏的表
  17. 功利性读书,提升认知效率
  18. [NOI2005]聪聪与可可
  19. 使用免费引流脚本,如何突破引流难的困境
  20. 计算机专用英语词汇1500词打印,计算机专用英语词汇1500词(4)

热门文章

  1. tableau必知必会之仪表板的最佳实践
  2. 如何解决实时历史数据库存储成本问题?
  3. hadoop学习-倒排索引
  4. python循环输入字典_python - 使用'for'循环迭代字典
  5. Python入门100题 | 第069题
  6. 面试总结-百度(1)
  7. 【算法数据结构Java实现】欧几里得算法
  8. 手把手教你搭建一个基于Java的分布式爬虫系统
  9. Java 线程池框架核心代码分析--转
  10. mysql 批量删除数据