Python Qt GUI设计:QPainter、QPen、QBrush和QPixmap窗口绘图类(基础篇—17)

目录

1、QPainter绘图类

2、QPen绘图类

3、QBrush绘图类

4、QPixmap绘图类


本篇博文主要介绍如何实现在窗口中绘图,在 PyQt5中,一般可以通过QPainter、QPen、QBrush和QPixmap这四个类来实现绘图功能。其中,QPixmap的作用是加载并呈现本地图像,而图像的呈现本质上也是通过绘图方式实现的。

1、QPainter绘图类

QPainter类在QWidget(控件)上执行绘图操作,它是一个绘制工具,为大部分图形界面提供了高度优化的函数,使QPainter类可以绘制从简单的直线到复杂的饼图等。

绘制操作在QWidget.paintEvent()中完成,绘制方法必须放在QtGui.QPainter对象的begin()和end()之间QPainter类在控件或其他绘图设备上执行较低级别的图形绘制功能,并通过如下表所示的方法进行绘制:

还可以设置画笔风格(PenStyle),这是一个枚举类,可以由QPainter类绘制。画笔风格如下表所示:

画笔效果如下所示:

来看看QPainter绘图类的示例,效果如下所示:


示例中,首先定义了待绘制的文字,代码如下所示:

self.text = '公众号:美男子玩编程'

然后,定义了一个绘制事件,所有的绘制操作都发生在此事件内。绘制事件代码如下所示:

  1. def paintEvent(self,event):

  2. painter = QPainter(self)

  3. painter.begin(self)

  4. # 自定义的绘画方法

  5. self.drawText(event, painter)

  6. painter.end()

QtGui.QPainter类负责所有低级别的绘制,所有的绘制方法都要放在begin()和end()之间。这个例子放置的是自定义的drawText()方法。自定义的绘制方法代码如下所示:

  1. def drawText(self, event, qp):

  2. # 设置笔的颜色

  3. qp.setPen( QColor(168, 34, 3) )

  4. # 设置字体

  5. qp.setFont( QFont('SimSun', 20))

  6. # 画出文本

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

实现代码如下所示:

  1. import sys

  2. from PyQt5.QtWidgets import QApplication ,QWidget

  3. from PyQt5.QtGui import QPainter ,QColor ,QFont

  4. from PyQt5.QtCore import Qt

  5. class Drawing(QWidget):

  6. def __init__(self,parent=None):

  7. super(Drawing,self).__init__(parent)

  8. self.setWindowTitle("在窗体中绘画出文字例子")

  9. self.resize(300, 200)

  10. self.text = '公众号:美男子玩编程'

  11. def paintEvent(self,event):

  12. painter = QPainter(self)

  13. painter.begin(self)

  14. # 自定义的绘画方法

  15. self.drawText(event, painter)

  16. painter.end()

  17. def drawText(self, event, qp):

  18. # 设置笔的颜色

  19. qp.setPen( QColor(168, 34, 3) )

  20. # 设置字体

  21. qp.setFont( QFont('SimSun', 20))

  22. # 画出文本

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

  24. if __name__ == "__main__":

  25. app = QApplication(sys.argv)

  26. demo = Drawing()

  27. demo.show()

  28. sys.exit(app.exec_())

QPainter绘制文字,实质上文字在屏幕上的显示是由一个个点(point)组成的,来看看QPainter如何绘制点。效果如下所示:


示例中,在窗口的工作区绘制正弦函数图形,周期是[-100,100]。画笔设置为红色,使用预定义的Qt.red颜色。每次调整窗口大小时,都会生成一个绘图事件。使用size()方法得到窗口的当前大小,在新的窗口中随机分布工作区中的点。最后使用drawPoint()方法绘制一个个点。

实现代码如下所示:

  1. import sys, math

  2. from PyQt5.QtWidgets import *

  3. from PyQt5.QtGui import *

  4. from PyQt5.QtCore import Qt

  5. class Drawing(QWidget):

  6. def __init__(self, parent=None):

  7. super(Drawing, self).__init__(parent)

  8. self.resize(300, 200)

  9. self.setWindowTitle("在窗体中画点")

  10. def paintEvent(self, event):

  11. qp = QPainter()

  12. qp.begin(self)

  13. # 自定义画点方法

  14. self.drawPoints(qp)

  15. qp.end()

  16. def drawPoints(self, qp):

  17. qp.setPen( Qt.red)

  18. size = self.size()

  19. for i in range(1000):

  20. # [-100, 100]两个周期的正弦函数图像

  21. x = 100 *(-1+2.0*i/1000)+ size.width()/2.0

  22. y = -50 * math.sin((x - size.width()/2.0)*math.pi/50) +

  23. size.height()/2.0

  24. qp.drawPoint(x, y)

  25. if __name__ == '__main__':

  26. app = QApplication(sys.argv)

  27. demo = Drawing()

  28. demo.show()

  29. sys.exit(app.exec_())

2、QPen绘图类

QPen(钢笔)是一个基本的图形对象,用于绘制直线、曲线或者给轮廓画出矩形、椭圆形、多边形及其他形状等。

来看看QPen绘图类的示例,效果如下所示:


示例中,使用6种不同的线条样式绘制了6条线,其中前5条线使用的是预定义的线条样式。也可以自定义线条样式,最后一条线就是使用自定义的线条样式绘制的。

以下代码创建了一个QPen对象。为了能更清晰地看清各线之间的差异,将颜色设置成黑色,宽度设置为2像素(px)。Qt.SolidLine是预定义的线条样式之一。

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

以下代码自定义了一种线条样式。使用Qt.customDashLine创建线条样式,然后调用setDashPattern()方法使用数字列表定义样式。数字列表的个数必须是偶数,在本例中数字列表是[1,4,5,4],它的个数是4。在数字列表中,奇数位(数字列表中的第1,3,5等位置)代表一段横线,偶数位(数字列表中的第2,4,6等位置)代表两段横线之间的空余距离。在数字列表中数字越大,横线和空余距离就越大。本例中数字列表[1,4,5,4]代表的意义是:1像素宽度的横线,4像素宽度的空余距离,5像素宽度的横线,4像素宽度的空余距离。

  1. pen.setStyle(Qt.CustomDashLine)

  2. pen.setDashPattern([1, 4, 5, 4])

  3. qp.setPen(pen)

  4. qp.drawLine(20, 240, 250, 240)

实现代码如下所示: 

  1. import sys

  2. from PyQt5.QtWidgets import *

  3. from PyQt5.QtGui import *

  4. from PyQt5.QtCore import Qt

  5. class Drawing(QWidget):

  6. def __init__(self):

  7. super().__init__()

  8. self.initUI()

  9. def initUI(self):

  10. self.setGeometry(300, 300, 280, 270)

  11. self.setWindowTitle('钢笔样式例子')

  12. def paintEvent(self, e):

  13. qp = QPainter()

  14. qp.begin(self)

  15. self.drawLines(qp)

  16. qp.end()

  17. def drawLines(self, qp):

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

  19. qp.setPen(pen)

  20. qp.drawLine(20, 40, 250, 40)

  21. pen.setStyle(Qt.DashLine)

  22. qp.setPen(pen)

  23. qp.drawLine(20, 80, 250, 80)

  24. pen.setStyle(Qt.DashDotLine)

  25. qp.setPen(pen)

  26. qp.drawLine(20, 120, 250, 120)

  27. pen.setStyle(Qt.DotLine)

  28. qp.setPen(pen)

  29. qp.drawLine(20, 160, 250, 160)

  30. pen.setStyle(Qt.DashDotDotLine)

  31. qp.setPen(pen)

  32. qp.drawLine(20, 200, 250, 200)

  33. pen.setStyle(Qt.CustomDashLine)

  34. pen.setDashPattern([1, 4, 5, 4])

  35. qp.setPen(pen)

  36. qp.drawLine(20, 240, 250, 240)

  37. if __name__ == '__main__':

  38. app = QApplication(sys.argv)

  39. demo = Drawing()

  40. demo.show()

  41. sys.exit(app.exec_())

3、QBrush绘图类

QBrush(画刷)是一个基本的图形对象,用于填充如矩形、椭圆形或多边形等形状。QBrush有三种类型:预定义、过渡和纹理图案。

来看看QBrush绘图类的示例,效果如下所示:

。。。。。。。。。。。。。。。。。

版权原因,完整文章,请参考如下:

Python Qt GUI设计:QPainter、QPen、QBrush和QPixmap窗口绘图类(基础篇—17)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值