pyqt5教程11:绘制外观
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:绘制外观相关推荐
- 第11课 Altium Designer20(AD20)+VESC6.4实战教程:绘制原理图8(北冥有鱼)
第11课 Altium Designer20(AD20)+VESC6.4实战教程:绘制原理图8(北冥有鱼)
- matlab设计菜单教程,MATLAB程序设计教程(11)——MATLAB图形用户界面设计
MATLAB程序设计教程(11)--MATLAB图形用户界面设计 第11章 MATLAB图形用户界面设计 11.1 菜单设计 11.2 对话框设计 11.3 图形用户界面设计工具 11.1菜单 ...
- ai怎么让图片任意变形_AI入门基础教程-图形绘制变形及路径查找器
原标题:AI入门基础教程-图形绘制变形及路径查找器 l 新建: l 界面: 多个预编辑区: l 存储格式: 1. .AI :AI软件默认的存储格式,相当于PS的PSD格式 2. .EPS:使用AI软件 ...
- matlab对话框设计,MATLAB程序设计教程(11)——MATLAB图形用户界面设计
MATLAB程序设计教程(11)--MATLAB图形用户界面设计 第11章 MATLAB图形用户界面设计 11.1 菜单设计 11.2 对话框设计 11.3 图形用户界面设计工具 11.1菜单 ...
- PyQt5 教程 《绘画》
目录 在PyQt5中绘画 QPainter的 paintEvent方法 绘图文字 绘图点 颜色 QPEN QBrush Bézier曲线 在PyQt5中绘画 PyQt5绘画系统能够渲染矢量图形,图像和 ...
- PyQt5教程(十二)——实现QQ登录界面(六、实现鼠标拖动界面,鼠标事件)
PyQt5教程(十二)--实现QQ登录界面(五.实现鼠标拖动界面,鼠标事件) 一.实现界面可以随着鼠标进行拖动 1.主要就是对鼠标事件的实现: def mousePressEvent(self, ev ...
- python读法1002python读法-Python教程之绘制Mandelbrot集合
原标题:Python教程之绘制Mandelbrot集合 一. 分形与混沌 自然界的很多事物,如树木.云彩.山脉.雪花.海岸线等,都呈现出传统几何学所不能描述的形状,这些形状都有如下的特性: 有着十分精 ...
- 黑马lavarel教程---11、响应处理
黑马lavarel教程---11.响应处理 一.总结 一句话总结: 如果在昂扬状态,看学习视频和运动时间重合,会很舒服 1.jquery的$.post参数为什么不需要占位? 因为每个参数的类型不同,可 ...
- STM32 电机教程 11 - BLDC 6 步方波开环速度控制
前言 无刷直流 (Brushless Direct Current, BLDC)电机是一种正快速普及的电机类型,它可在家用电器.汽车.航空航天.消费品.医疗.工业自动化设备和仪器等行业中使用.正如名称 ...
最新文章
- 关于C#中async/await中的异常处理(上)
- 如何让EasyUI弹出层跳出框架
- adminLTE 教程 -4 轮播控件
- 精心挑选的23款美轮美奂的 jQuery 图片特效插件
- python日期迭代_计算敏捷项目中迭代时间安排(Python3版)
- python3自动化软件发布系统_基于python3做C/S端自动化测试可能用到的工具(不断更新中。。。。)...
- es-03-DSL的简单使用
- 基于模板的通用代码生成器LKGenerator(四)-核心技术之各种数据库查询表信息sql整理...
- GDAL C# “OSGeo.GDAL.GdalPINVOKE”的类型初始值设定项引发异常 解决方法
- php判断长度函数是,php判断字符串长度 strlen()与mb_strlen()函数
- Cisco 证书查询
- springboot 问卷调查系统
- Go 每日一库之 roaring
- 三菱电梯开门键一直亮_电梯反复开关门是什么原因?
- [usaco2010 Oct]Soda Machine (入门oj Problem 6195 )
- mysql修复损坏表_在MySQL中,如何修复损坏的表
- 功利性读书,提升认知效率
- [NOI2005]聪聪与可可
- 使用免费引流脚本,如何突破引流难的困境
- 计算机专用英语词汇1500词打印,计算机专用英语词汇1500词(4)