目录

在PyQt5中绘画

QPainter的

paintEvent方法

绘图文字

绘图点

颜色

QPEN

QBrush

Bézier曲线


在PyQt5中绘画

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

QPainter的

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

paintEvent方法

这幅画是在这个paintEvent()方法中完成的。绘图代码放在对象的方法begin()和 end()方法之间QPainter。它在小部件和其他绘图设备上执行低级绘制。

绘图文字

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

#!/usr/bin/python3
# -*- coding: utf-8 -*-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, 280, 170)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)        if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

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

def paintEvent(self,event):
...

绘图在绘画事件中完成。

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

QPainter班负责所有低级绘画。所有的绘画方法介于begin()end()方法之间。实际绘画被委托给该drawText()方法。

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

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

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

drawText()方法在窗口上绘制文本。rect()paint事件的方法返回需要更新的矩形。随着Qt.AlignCenter我们对齐两个维度的文本。

图:绘图文字

绘图点

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

#!/usr/bin/python3
# -*- coding: utf-8 -*-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()for i in range(1000):x = random.randint(1, size.width()-1)y = random.randint(1, size.height()-1)qp.drawPoint(x, y)     if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

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

qp.setPen(Qt.red)

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

size = self.size()

每次调整窗口大小时,都会生成一个绘制事件。我们使用该size()方法获得窗口的当前大小。我们使用窗口的大小来分布窗口的客户区域上的点。

qp.drawPoint(x,y) 

我们用这个drawPoint()方法说明了这一点。

图:点数

颜色

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

#!/usr/bin/python3
# -*- coding: utf-8 -*-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)if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

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

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

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

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

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

图:颜色

QPEN

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

#!/usr/bin/python3
# -*- coding: utf-8 -*-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)if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

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

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()方法。数字列表定义了一种风格。必须有偶数个数字。奇数定义了破折号,偶数数字空间。数字越大,空间或破折号越大。我们的模式是1px破折号,4px空间,5px破折号,4px空间等。

图:笔样式

QBrush

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

#!/usr/bin/python3
# -*- coding: utf-8 -*-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)if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

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

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

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

图:刷子

Bézier曲线

贝塞尔曲线是一条立方线。PyQt5中的Bézier曲线可以用QPainterPath。画家路径是由许多图形构建块组成的对象,例如矩形,椭圆,线和曲线。

#!/usr/bin/python3
# -*- coding: utf-8 -*-from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QPainterPath
from PyQt5.QtCore import Qt
import sysclass 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)if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

此示例绘制Bézier曲线。

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

我们用QPainterPath路径创建Bézier曲线。曲线是用cubicTo()方法创建的,它取三个点:起点,控制点和终点。

qp.drawPath(path)

最后的路径是用drawPath()方法绘制的。

图:Bézier曲线

在PyQt5教程的这一部分中,我们做了一些基本的绘画。

PyQt5 教程 《绘画》相关推荐

  1. PyQt5的日期和时间

    PyQt5的这部分教程展示了如何使用PyQt5的日期和时间模块. QDate,QTime,QDateTime PyQt5使用QDate,QDateTime,QTime类来操作日期和时间.QDate是一 ...

  2. pyqt5显示日期与时间

    PyQt5具有QDate,QDateTime,QTime类来处理日期和时间. QDate是用于使用公历中的日历日期的类. 它具有确定日期,比较或处理日期的方法. QTime类使用时钟时间. 它提供了比 ...

  3. PyQt5 教程 《日期和时间》

    导读 目录 导读 PyQt5的日期和时间 QDate,QTime,QDateTime 当前日期和时间 UTC时间 天数 天数的差异 日期时间算术 夏令时 Unix时代 Julian day 历史战役 ...

  4. 详解 Java 日期与时间

    文章目录 一.时区 二.夏令时 三.旧 API 3.1. Date 3.2. SimpleDateFormat 3.3. Calendar 四.新 API 4.1. LocalDateTime 4.2 ...

  5. PyQt5教程(二):日期与时间

    原文链接:http://zetcode.com/gui/pyqt5/datetime/ PyQt5日期与时间 QDate, QTime, QDateTime PyQt5用于处理日期和时间的类有QDat ...

  6. php入门时间,php入门教程(二十一) php日期与时间函数

    本节内容: php日期与时间函数 PHP提供了很多的处理日期和时间的函数,包括time().date().mktime().checkdate().microtime().strtotime()等,详 ...

  7. Python基础教程(八):日期和时间、文件I/O、异常处理

    Python 日期和时间 Python程序能用很多方式处理日期和时间.转换日期格式是一个常见的例行琐事.Python有一个 time 和 calendar 模组可以帮忙. 什么是Tick? 时间间隔是 ...

  8. C++基础教程之日期和时间

    标题:C++基础教程之日期和时间 C++ 标准库没有提供所谓的日期类型.C++ 继承了 C 语言用于日期和时间操作的结构和函数.为了使用日期和时间相关的函数和结构,需要在 C++ 程序中引用 头文件. ...

  9. java 世界协调时间格式_Java核心教程之常见时间日期的处理方法

    Java日期处理类Date详解 时间的基础知识 时区:整个地球分为二十四时区,每个时区都有自己的本地时间. 为了统一起见,使用一个统一的时间,称为全球标准时间(UTC,Universal Time C ...

  10. 微信小程序获取系统日期和时间 —— 微信小程序教程系列(17)

    获取当前系统日期和时间 在小程序中,新建项目时,就会有一个utils.js文件,就是获取日期和时间的,代码如下: utils.js: function formatTime(date) {var ye ...

最新文章

  1. 稚晖君自制机械臂,能给葡萄缝针的那种,成本1万块,网友:能把脑子开源一下?...
  2. 什么是用户对计算机进行配置的重要工具,《计算机常用工具软件》试题1
  3. Linux / sudo、su、sudo su、sudo -i 使用和区别
  4. Linux,扇区,块,文件系统,目录中的记录项
  5. Python可视化 | Matplotlib绘制圆环图的两种方法!
  6. Curator实现分布式锁的基本原理-InterProcessMutex.acquire
  7. MTK 驱动开发(29)---TP 驱动移植
  8. Atitit mysql insert perf enhance 批量插入数据库性能 目录 1.1. 案一:使用ignore关键字 1 2. 异步插入 2 2.1. 其它关键:DELAYED  做为
  9. PHP在线讨饭源码+支付宝当面付DEMO+自动在线要饭源码+安装教程
  10. 一起学习PySNMP——理解什么是MIB
  11. cisco2960(思科2960)
  12. 纽约州立大学石溪分校肖可瓅:数据驱动的金融研究
  13. 苹果拼图软件测试,视频照片拼图APP
  14. 如何在应用中打开系统播放器
  15. ConceptDraw MINDMAP 12 Mac版思维导图软件有哪些有点?
  16. php pdo的用法,php pdo函数库用法详解
  17. Python爬虫 - 获取网页编码
  18. RIA 阅读法 是什么
  19. C语言_逻辑运算符使用分析
  20. js奇淫巧计--常用总结

热门文章

  1. python3 selenium webdriver.Chrome php 爬取汽车之家所有车型详情数据[开源版]
  2. GC 疑难情况问题排查与分析(下篇)
  3. linux内存的反向映射
  4. C 语言 GET请求 超小纯净下载工具 (支持http、https)第四季
  5. 这些酷酷的文字特效图片,制作真的很简单!
  6. Linux安装宝塔命令
  7. numpy实现数学中的各种积
  8. Kohonen Self Organize Maps
  9. 阿里云Code 仓库如何设置公钥详解版本
  10. mysql备份并且修改表名