目录

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 = '公众号:美男子玩编程'

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

 def paintEvent(self,event):painter = QPainter(self)        painter.begin(self)# 自定义的绘画方法self.drawText(event, painter)painter.end()

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

 def drawText(self, event, qp):# 设置笔的颜色qp.setPen( QColor(168, 34, 3) )# 设置字体qp.setFont( QFont('SimSun', 20))# 画出文本qp.drawText(event.rect(), Qt.AlignCenter, self.text)

实现代码如下所示:

import sys
from PyQt5.QtWidgets import QApplication  ,QWidget
from PyQt5.QtGui import QPainter ,QColor ,QFont
from PyQt5.QtCore import Qt class Drawing(QWidget):def __init__(self,parent=None):super(Drawing,self).__init__(parent)self.setWindowTitle("在窗体中绘画出文字例子") self.resize(300, 200)        self.text = '公众号:美男子玩编程'def paintEvent(self,event):painter = QPainter(self)        painter.begin(self)# 自定义的绘画方法self.drawText(event, painter)painter.end()def drawText(self, event, qp):# 设置笔的颜色qp.setPen( QColor(168, 34, 3) )# 设置字体qp.setFont( QFont('SimSun', 20))# 画出文本qp.drawText(event.rect(), Qt.AlignCenter, self.text)if __name__ == "__main__":  app = QApplication(sys.argv) demo = Drawing()demo.show()sys.exit(app.exec_())

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

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

实现代码如下所示:

import sys, math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt class Drawing(QWidget):def __init__(self, parent=None):super(Drawing, self).__init__(parent)self.resize(300, 200)  self.setWindowTitle("在窗体中画点")         def paintEvent(self, event):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):# [-100, 100]两个周期的正弦函数图像x = 100 *(-1+2.0*i/1000)+ size.width()/2.0y = -50 * math.sin((x - size.width()/2.0)*math.pi/50) + size.height()/2.0qp.drawPoint(x, y)if __name__ == '__main__':app = QApplication(sys.argv)demo  = Drawing()demo.show()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像素宽度的空余距离。

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

实现代码如下所示:

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt class Drawing(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):   self.setGeometry(300, 300, 280, 270)self.setWindowTitle('钢笔样式例子')        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)demo = Drawing()demo.show()sys.exit(app.exec_())

3、QBrush绘图类

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

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

在这个例子中,在窗口中绘制出9种不同背景填充的矩形。定义QBrush 对象,然后将QPainter对象的画刷设置成QBrush 对象,并通过调用drawRect()方法绘制矩形。

实现代码如下所示:

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt class Drawing(QWidget): def __init__(self):super().__init__()  self.initUI()def initUI(self):   self.setGeometry(300, 300, 365, 280)self.setWindowTitle('画刷例子')        self.show()def paintEvent(self, e): qp = QPainter()qp.begin(self)self.drawLines(qp)qp.end()def drawLines(self, qp): 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.DiagCrossPattern)qp.setBrush(brush)qp.drawRect(10, 105, 90, 60)brush = QBrush(Qt.Dense5Pattern)qp.setBrush(brush)qp.drawRect(130, 105, 90, 60)brush = QBrush(Qt.Dense6Pattern)qp.setBrush(brush)qp.drawRect(250, 105, 90, 60)brush = QBrush(Qt.HorPattern)qp.setBrush(brush)qp.drawRect(10, 195, 90, 60)brush = QBrush(Qt.VerPattern)qp.setBrush(brush)qp.drawRect(130, 195, 90, 60)brush = QBrush(Qt.BDiagPattern)qp.setBrush(brush)qp.drawRect(250, 195, 90, 60)if __name__ == '__main__':app = QApplication(sys.argv)demo = Drawing()demo.show()sys.exit(app.exec_())

4、QPixmap绘图类

QPixmap类用于绘图设备的图像显示,它可以作为一个QPaintDevice对象,也可以加载到一个控件中,通常是标签或按钮,用于在标签或按钮上显示图像。

QPixmap可以读取的图像文件类型有BMP、GIF、JPG、JPEG、PNG、PBM、PGM、PPM、XBM、XPM等。

QPixmap类中的常用方法如下表所示:

示例中,使用setPixmap()将图像显示在QLabel上。实现代码如下所示:

实现代码如下所示:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *if __name__ == '__main__':app = QApplication(sys.argv)win = QWidget()lab1 = QLabel()lab1.setPixmap(QPixmap("./2.jpg"))vbox=QVBoxLayout()vbox.addWidget(lab1)win.setLayout(vbox)win.setWindowTitle("QPixmap 例子")win.show()sys.exit(app.exec_())

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

  1. Python Qt GUI设计:信号与槽的使用方法(基础篇—7)

    目录 1.信号与槽的概念 2.信号与槽的基础函数 2.1.创建信号函数 2.2.连接信号函数 2.3.断开信号函数 2.4.发射信号函数 3.信号和槽的使用方法 3.1.内置信号与槽的使用 3.2.自 ...

  2. Python Qt GUI设计:QPushButton、QRadioButton和QCheckBox按钮类(基础篇—12)

    目录 1.QPushButton按钮类 2.QRadioButton按钮类 3.QCheckBox按钮类 在GUI设计中,按钮都是最重要的和常用的触发动作请求的方式,用来与用户进行交互操作.在PyQt ...

  3. Python Qt GUI设计:如何调整组件布局比例?(拓展篇—1)

    目录 1.Qt Designer调整组件布局比例 2.addStretch()函数调整组件布局比例 在一个布局容器中,有时可能需要调整各组件的显示比例,让界面达到更美观效果. 调整组件布局比例有两种办 ...

  4. Python Qt GUI设计:QTabWidget、QStackedWidget和QDockWidget容器控件类(提升篇—2)

    目录 1.QTabWidget容器控件类 2.QStackedWidget容器控件类 3.QDockWidget容器控件类 有时候我们可能会面临这样一种情况:所开发的程序包含了太多的控件,导致一个窗口 ...

  5. Python Qt GUI设计:窗口布局管理方法【强化】(基础篇—6)

    目录 1. 水平布局类(QHBoxLayout) 2.垂直布局类(QVBoxLayout) 3.网格布局类(QGridLayout) 3.1.单一的网络布局 3.2.跨越行.列的网络布局 4.表单布局 ...

  6. Python Qt GUI设计:窗口布局管理方法【基础】(基础篇—5)

    目录 1.布局管理器进行布局 2.容器控件进行布局 3.geometry属性:控件绝对布局 4.sizePolicy属性:微调优化控件布局 Qt Designer提供4种窗口布局方式,分别如下: Ve ...

  7. Python Qt GUI设计:将UI文件转换为Python文件的三种妙招(基础篇—2)

    目录 1.创建项目 2.将.ui文件生成.py文件 2.1.Eric 6编译 2.2.Python命令行编译 2.3.脚本编译 3.界面.逻辑分离思想 在开始本文之前提醒各位朋友,Python记得安装 ...

  8. Python Qt GUI设计:QPrinter打印图片类(基础篇—21)

    打印图像是图像处理软件中的一个常用功能,打印图像实际上是在QPaintDevice中画图,与平常在QWidget.QPixmap和Qlmage中画图一样,都是创建一个QPainter对象进行画图的,只 ...

  9. Python Qt GUI设计:QMdiArea和QMdiSubWindow类实现多文档界面(拓展篇—3)

    一个典型的GUI应用程序可能有多个窗口,选项卡控件和堆栈窗口控件允许一次使用其中的一个窗口.然而,很多时候这种方法不是很有用,因为其他窗口的视图是隐藏的一种同时显示多个窗口的方法是,创建多个独立的窗口 ...

最新文章

  1. SAP MM 采购申请中的物料组字段改成Optional
  2. Akka 系列(五):Java 和 Scala 中的 Future
  3. exe注册为service服务
  4. 感知器 Perceptron
  5. java 线程的几种状态
  6. opengl加载显示3D模型UC类型文件
  7. Spring Boot 几条最佳实践!
  8. Jenkins修改管理员密码.
  9. mysql执行动态说起来_MySQL实战45讲学习笔记:第十四讲
  10. vidalia 更换浏览器代理
  11. 台湾半导体封测商南茂股东大会通过紫光24亿元入股案
  12. c语言 sizeof(unsign),C语言基础知识
  13. git恢复已删除的本地分支
  14. 比较有意思的.NET反调—《.NET在蹉跎中一路前行》
  15. Google Earth Engine(GEE)合成长时序的月NDVI与LST
  16. 6s连接wifi上不了网络连接服务器未响应,iPhone 6/iPhone 6S 突然连不上wifi,wifi开了连不上wifi信号差...
  17. 文件在另一个程序中打开,无法删除~【删除文件被占用问题】(保姆级教程,五种解决办法~)
  18. APP按下home键恢复到登录(主界面)
  19. Matlab:设置命令历史记录预设项
  20. 双硬盘Win10+Ubuntu双系统安装

热门文章

  1. 【CV】吴恩达机器学习课程笔记 | 第1-15章
  2. 2022-2028年中国半导体硅片行业深度调研及投资前景预测报告
  3. 安装 Python MySQL 驱动(mysql-connector-python、MySQL-python)
  4. 深入jQuery中的data()
  5. 第十二周 11.15-11.21
  6. 20135234mqy 实验四
  7. 梦想的地方!地球上最值得去的20个地方【组图】
  8. Delta3D———通过游戏管理器组件和消息的扩展创建自定义行为 《转》
  9. ProxyError: Conda cannot proceed due to an error in your proxy configuration
  10. 域中计算机设定重启,域中添加计算机设定的步骤