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

简介: 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类在控件或其他绘图设备上执行较低级别的图形绘制功能,并通过如下表所示的方法进行绘制:


image.png


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


image.png


画笔效果如下所示:


image.png


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


image.png


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


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如何绘制点。效果如下所示:


image.png


示例中,在窗口的工作区绘制正弦函数图形,周期是[-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.0
    y = -50 * math.sin((x - size.width()/2.0)*math.pi/50) + size.height()/2.0
    qp.drawPoint(x, y)
if __name__ == '__main__':
  app = QApplication(sys.argv)
  demo  = Drawing()
  demo.show()
  sys.exit(app.exec_())

2、QPen绘图类

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


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


image.png


示例中,使用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绘图类的示例,效果如下所示:


image.png


在这个例子中,在窗口中绘制出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类中的常用方法如下表所示:


image.png


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


image.png


实现代码如下所示:


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_())
相关文章
|
6天前
|
设计模式 机器学习/深度学习 前端开发
Python 高级编程与实战:深入理解设计模式与软件架构
本文深入探讨了Python中的设计模式与软件架构,涵盖单例、工厂、观察者模式及MVC、微服务架构,并通过实战项目如插件系统和Web应用帮助读者掌握这些技术。文章提供了代码示例,便于理解和实践。最后推荐了进一步学习的资源,助力提升Python编程技能。
|
2月前
|
测试技术 Python
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
150 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
|
4月前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
4月前
|
设计模式 开发者 Python
Python编程中的设计模式应用与实践感悟####
本文作为一篇技术性文章,旨在深入探讨Python编程中设计模式的应用价值与实践心得。在快速迭代的软件开发领域,设计模式如同导航灯塔,指引开发者构建高效、可维护的软件架构。本文将通过具体案例,展现设计模式如何在实际项目中解决复杂问题,提升代码质量,并分享个人在实践过程中的体会与感悟。 ####
|
3月前
|
数据采集 存储 XML
python实战——使用代理IP批量获取手机类电商数据
本文介绍了如何使用代理IP批量获取华为荣耀Magic7 Pro手机在电商网站的商品数据,包括名称、价格、销量和用户评价等。通过Python实现自动化采集,并存储到本地文件中。使用青果网络的代理IP服务,可以提高数据采集的安全性和效率,确保数据的多样性和准确性。文中详细描述了准备工作、API鉴权、代理授权及获取接口的过程,并提供了代码示例,帮助读者快速上手。手机数据来源为京东(item.jd.com),代理IP资源来自青果网络(qg.net)。
|
4月前
|
设计模式 算法 搜索推荐
Python编程中的设计模式:优雅解决复杂问题的钥匙####
本文将探讨Python编程中几种核心设计模式的应用实例与优势,不涉及具体代码示例,而是聚焦于每种模式背后的设计理念、适用场景及其如何促进代码的可维护性和扩展性。通过理解这些设计模式,开发者可以更加高效地构建软件系统,实现代码复用,提升项目质量。 ####
|
4月前
|
设计模式 监控 算法
Python编程中的设计模式应用与实践感悟###
在Python这片广阔的编程疆域中,设计模式如同导航的灯塔,指引着开发者穿越复杂性的迷雾,构建出既高效又易于维护的代码结构。本文基于个人实践经验,深入探讨了几种核心设计模式在Python项目中的应用策略与实现细节,旨在为读者揭示这些模式背后的思想如何转化为提升软件质量的实际力量。通过具体案例分析,展现了设计模式在解决实际问题中的独特魅力,鼓励开发者在日常编码中积极采纳并灵活运用这些宝贵的经验总结。 ###
|
5月前
(14)Qt绘图(one)
本文介绍了在Qt中使用QPainter进行绘图的基础操作,包括如何指定绘图设备、使用QPen和QBrush设置线条和填充样式、绘制不同样式的线条和形状,以及如何实现纹理填充和渐变填充等效果。
97 6
(14)Qt绘图(one)
|
5月前
|
计算机视觉
(15)Qt绘图(two)
Qt框架中QPainter类的多种绘图功能,包括坐标变换、基本图形绘制、文本和图片绘制、图像保存以及碰撞检测等。
70 1
(15)Qt绘图(two)
|
4月前
|
设计模式 监控 数据库连接
Python编程中的设计模式之美:提升代码质量与可维护性####
【10月更文挑战第21天】 一段简短而富有启发性的开头,引出文章的核心价值所在。 在编程的世界里,设计模式如同建筑师手中的蓝图,为软件的设计和实现提供了一套经过验证的解决方案。本文将深入浅出地探讨Python编程中几种常见的设计模式,通过实例展示它们如何帮助我们构建更加灵活、可扩展且易于维护的代码。 ####

热门文章

最新文章

推荐镜像

更多