QBrush简介

QBrush类定义由QPainter绘制的形状的填充图案。一个画刷可以有颜色,填充图案,渐变和纹理属性。

样式填充使用Qt.BrushStyle枚举变量定义填充图案。默认的填充样式为Qt.NoBrush,在这种样式下表示不填充所画的物体。标准填充样式为Qt.SolidPattern。可以在创建画刷对象是时候设置填充模式,也可以在创建对象后使用setSyle()函数来设置或者更改填充样式。下图显示了Qt中定义的填充模式

QBrush各种填充样式(图片来源:doc.qt.io)

color()定义填充图案的颜色,该颜色可以是Qt.GlobalColor中预定义的演示,也可以是其他任何QColor颜色。gradient()定义所使用的渐变填充样式, Qt提供了三种不同的渐变填充QLinearGradient,QConicalGradient和QRadialGradient。当填充模式使用Qt.TexturePattern时,则可以在创建画刷时提供像素图或者使用setTexture()来创建具有纹理填充功能的画刷。

注意:无论先前设置了什么样的填充模式,如果使用了setTexture(),都会使填充模式变成Qt.TexturePattern。如果填充模式我渐变,则setColor函数不起作用。

QBrush定义常用函数:

  • setColor():更改当前设置的颜色。
  • color(): 获得当前设置的颜色。
  • gradient():获得画刷的渐变设置。
  • setColor(): 将画刷的颜色设置为指定的颜色。
  • color(): 获得画刷的颜色。
  • setStyle(): 设置画刷的填充样式。
  • style(): 获得画刷的填充样式。
  • setTexture(): 设置画刷的纹理填充图像,同时将画刷的填充样式设置为Qt.TexturePattern。
  • texture(): 返回纹理图像。
  • setTransform(): 设置画刷的变换矩阵。画刷的变换矩阵与QPainter的变换矩阵合并产生最终的绘制效果。
  • tansform(): 返回画刷的当前变换矩阵。

测试

测试代码演示了如何使用画刷的各种填充模式,包括,颜色,样式,渐变,纹理等各种属性的演示。完整代码如下:

import sys, mathfrom PyQt5 import QtCore, QtGui, QtWidgetsfrom PyQt5.QtCore import Qt, QPoint, QPointFfrom PyQt5.QtGui import (QColor,QPen, QPainter, QPainterPath, QPolygonF, QBrush,                          QLinearGradient, QConicalGradient, QRadialGradient, QGradient,                         QPixmap)from PyQt5.QtWidgets import (QApplication, QWidget, QHBoxLayout, QFormLayout,                              QLabel, QFrame, QSizePolicy, QSpinBox, QPushButton,                             QColorDialog, QComboBox, QFileDialog) class MyFrame(QFrame):    def __init__(self, parent = None):        super(MyFrame, self).__init__(parent)        self.setFrameShape(QFrame.Box)        self.setFrameShadow(QFrame.Plain)        self.setLineWidth(1)        self.setMidLineWidth(0)        self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)                self.brushColor = Qt.black        self.pattern = Qt.SolidPattern        self.filename = ''            def setBrushColor(self, color):        self.brushColor = color        self.update()            def setPattern(self, pattern):        self.pattern = pattern        self.update()                    def setTexture(self, filename):        self.pattern = Qt.TexturePattern        self.filename = filename        self.update()            def paintEvent(self, event):        painter = QPainter(self)        painter.setRenderHint(QPainter.Antialiasing, True)                #绘制边框线        painter.drawRect(self.rect())                pen = QPen()        pen.setColor(Qt.darkBlue)        painter.setPen(pen)                brush = QBrush()        brush.setColor(self.brushColor)                if self.pattern == Qt.TexturePattern:            brush.setTexture(QPixmap(self.filename))        elif self.pattern == Qt.LinearGradientPattern:            lg = QLinearGradient(0, 0, 100, 0)            lg.setColorAt(0, Qt.red)            #lg.setSpread(QGradient.RepeatSpread)            lg.setColorAt(1, Qt.blue)            brush = QBrush(lg)                  elif self.pattern == Qt.RadialGradientPattern:            rg = QRadialGradient(50, 50, 200, 100, 100)            rg.setColorAt(0, Qt.red)            rg.setColorAt(1, Qt.blue)            rg.setSpread(QGradient.RepeatSpread)            brush = QBrush(rg)          elif self.pattern == Qt.ConicalGradientPattern:            cg = QConicalGradient(100, 100, 120)            cg.setColorAt(0, Qt.red)            cg.setColorAt(1, Qt.blue)            cg.setSpread(QGradient.RepeatSpread)            brush = QBrush(cg)        else:            brush.setStyle(self.pattern)         painter.setBrush(brush)           painter.drawRect(10, 10, 200, 160)        painter.drawEllipse(300, 10, 160, 160)              painter.drawPie(10, 240, 240, 240, 30 * 16, 110 * 16)                #绘制五角星        #添加一个多边形(五角星)        #外点:x=Rcos(72°*k)  y=Rsin(72°*k)   k=0,1,2,3,4        #内点:r=Rsin18°/sin36°  x=rcos(72°*k+36°)  y=rsin(72°*k+36°)   k=0,1,2,3,4        deg_18 = 18 * math.pi / 180        deg_36 = 36 * math.pi / 180        deg_72 = 72 * math.pi / 180        r_out = 100 #半径        r_inner = r_out * math.sin(deg_18) / math.sin(deg_36)        polygon = QPolygonF()        for i in range (5) :               #外点            out_angle = deg_72 * i - deg_18               polygon.append(QPointF(r_out * math.cos(out_angle), r_out * math.sin(out_angle)))             #内点            in_angle =  deg_72 * i + deg_18            polygon.append(QPointF(r_inner * math.cos(in_angle), r_inner * math.sin(in_angle)))                painter.translate(380, 280)        painter.drawPolygon(polygon, Qt.WindingFill)                class DemoBrush(QWidget):    def __init__(self, parent=None):        super(DemoBrush, self).__init__(parent)                   # 设置窗口标题        self.setWindowTitle('实战PyQt5: QBrush演示')                 #设置尺寸        self.resize(720, 400)                          self.initUi()            def initUi(self):        layout = QHBoxLayout()                self.canvas = MyFrame()                #颜色设置        btnSetColor = QPushButton('设置颜色')        btnSetColor.clicked.connect(self.onSetBrushColor)                #填充模式        cmbBrusStyle = QComboBox()        cmbBrusStyle.addItems(['NoBrush', 'SolidPattern', 'Dense1Pattern', 'Dense2Pattern',                                'Dense3Pattern', 'Dense4Pattern','Dense5Pattern','Dense6Pattern',                               'Dense7Pattern', 'HorPattern', 'VerPattern', 'CrossPattern',                               'BDiagPattern', 'FDiagPattern', 'DiagCrossPattern'])        cmbBrusStyle.currentTextChanged.connect(self.onBrushStyleChanged)        cmbBrusStyle.setCurrentIndex(1)                #渐变        cmbGradient = QComboBox()        cmbGradient.addItems(['None', 'LinearGradientPattern', 'RadialGradientPattern', 'ConicalGradientPattern'])        cmbGradient.currentTextChanged.connect(self.onGradientChanged)                #纹理        btnTexture = QPushButton('打开图像文件')        btnTexture.clicked.connect(self.onButtonTextureClicked)                fLayout = QFormLayout()        fLayout.setContentsMargins(0,0,0,0)        fLayout.addRow('颜色: ', btnSetColor)        fLayout.addRow('填充模式: ', cmbBrusStyle)        fLayout.addRow('渐变: ', cmbGradient)        fLayout.addRow('纹理: ', btnTexture)                wid_left = QWidget()        wid_left.setMaximumWidth(200)        wid_left.setLayout(fLayout)                          layout.addWidget(wid_left)        layout.addWidget(self.canvas)                self.setLayout(layout)            def onSetBrushColor(self):       color = QColorDialog.getColor()       self.canvas.setBrushColor(color)           def onBrushStyleChanged(self, style):        if style == 'SolidPattern':            self.canvas.setPattern(Qt.SolidPattern)        elif style == 'Dense1Pattern':            self.canvas.setPattern(Qt.Dense1Pattern)        elif style == 'Dense2Pattern':            self.canvas.setPattern(Qt.Dense2Pattern)        elif style == 'Dense3Pattern':            self.canvas.setPattern(Qt.Dense3Pattern)        elif style == 'Dense4Pattern':            self.canvas.setPattern(Qt.Dense4Pattern)        elif style == 'Dense5Pattern':            self.canvas.setPattern(Qt.Dense5Pattern)        elif style == 'Dense6Pattern':            self.canvas.setPattern(Qt.Dense6Pattern)        elif style == 'Dense7Pattern':            self.canvas.setPattern(Qt.Dense7Pattern)        elif style == 'HorPattern':            self.canvas.setPattern(Qt.HorPattern)        elif style == 'VerPattern':            self.canvas.setPattern(Qt.VerPattern)        elif style == 'CrossPattern':            self.canvas.setPattern(Qt.CrossPattern)        elif style == 'BDiagPattern':            self.canvas.setPattern(Qt.BDiagPattern)        elif style == 'FDiagPattern':            self.canvas.setPattern(Qt.FDiagPattern)        elif style == 'DiagCrossPattern':            self.canvas.setPattern(Qt.DiagCrossPattern)        else:            self.canvas.setPattern(Qt.NoBrush)                def onGradientChanged(self, style):        if style == 'LinearGradientPattern':            self.canvas.setPattern(Qt.LinearGradientPattern)        elif style == 'RadialGradientPattern':            self.canvas.setPattern(Qt.RadialGradientPattern)        elif style == 'ConicalGradientPattern':            self.canvas.setPattern(Qt.ConicalGradientPattern)        else:            self.canvas.setPattern(Qt.NoBrush)                def onButtonTextureClicked(self):        path,_ = QFileDialog.getOpenFileName(self, '打开图像文件', '', '图像文件 (*.png)')                if path:            self.canvas.setTexture(path)                if __name__ == '__main__':    app = QApplication(sys.argv)    window = DemoBrush()    window.show()    sys.exit(app.exec())

运行结果如下图:

QBrush演示

本文知识点

  • QBrush用于填充一个区域,QPen用于绘制一个区域的边框线
  • QBrush的填充样式
  • QGradient 渐变控制

前一篇: 实战PyQt5: 115-画笔类QPen


喜欢的人,请多多关注,评论,收藏,点赞,和转发。

pyqt5 qwidget 边框_实战PyQt5: 116-画刷类QBrush相关推荐

  1. button 样式_实战PyQt5: 111-可以使用QSS样式表的部件

    可以使用QSS样式表的部件 QSS样式表支持各种部件,属性,伪状态和子控件,从而可以实现定制部件的外观,下面我们将详细列出可以使用QSS样式表的部件: QAbstractScrollArea:所有派生 ...

  2. qchart 设置线颜色_实战PyQt5: 137-QChart图表之散点图

    散点图(scatter chart)将序列显示为一组点.值由点在图表中的位置表示.类别由图表中的不同标记表示.散点图通常用于比较跨类别的聚合数据.在QChart中,使用类QScatterSeries创 ...

  3. qchart 坐标轴设置_实战PyQt5: 156-QChart图表之更换图表主题

    图表主题 QChart定义了多种图表主题,可以创建不同风格的图表显示,在调整图表主题风格的时候,为了使整个应用的风格看起来更和谐一致,一般要使用应用程序的背景调色板来调整应用的颜色以适配图表所选的主题 ...

  4. easyui tree复选框是否打钩状态_实战PyQt5: 010-复选框控件QCheckBox

    复选框QCheckBox简介 QCheckBox 复选框,通常用于表示可以启用或禁用应用中的功能. QCheckBox中的常用方法: setText(): 设置复选框的显示文本: setEnabled ...

  5. pyqt5获取文本框里输入的值_实战PyQt5: 060-输入对话框QInputDialog

    QInputDialog简介 在GUI应用中,经常有一些简单的输入信息需要交互,这时候可以使用QInputDialog来快速完成我们的工作,而不必创建一个新的对话框来实现. QInputDialog控 ...

  6. qtabwidget的图标_实战PyQt5: 050-选项卡控件QTabWidget

    QTabWidget简介 在GUI应用软件中,多页面的切换的使用范围十分广泛,在操作过程中,用户使用鼠标点击不同的标题栏就可以方便展示不同页面的内容,众多界面共用一块显示区域,在有限的就显示区域中可以 ...

  7. pyqt 子窗口控制主窗口绘图_实战PyQt5: 005-主窗口QMainWindow

    QMainWindow简介 在桌面应用中,一个应用软件通常都会包含一个主窗口,主窗口是承载所有控件的窗体, 在PyQt5中常用的主窗体有两种QMainWindow和QDialog,他们也都继承自QWi ...

  8. pyqt5从子目录加载qrc文件_实战PyQt5: 045-添加资源文件

    添加资源文件 在使用PyQt进行图形界面开发的时候不免要用到一些外部资源,比如图片,qss配置文件等.在前面代码中,遇到这类问题,我们使用绝对路径的方式来解决,这种方式,本身有其不方便之处(比如,调整 ...

  9. chart.js 饼图显示百分比_实战PyQt5: 135-数据可视化之QChart绘制饼图

    饼图是数据可视图表的基本类型,在QChart中,QPieSeries, QPieSlice处理饼图的绘制. QPieSeries QPieSeries类以饼图形式显示数据.饼图系列由定义为QPieSl ...

最新文章

  1. Red Hat Linux 5.2 14T大文件系统 分区过程
  2. 洛谷P3773 [CTSC2017]吉夫特(Lucas定理,dp)
  3. extjs中js资源缓存策略
  4. TOJ---2621--全排列
  5. dc综合与pt静态时序分析(中文)_新能源汽车小三电系统(PDU/DC/OBC)技术研究详解...
  6. SecureCRT的Backspace显示为^H的解决办法
  7. matlab计算机械臂素的,机械臂动力学——动力学建模
  8. 智慧旅游监管平台建设方案
  9. JSP基本语法(2)函数
  10. 互联网巨头“赢家通吃”,会产生哪些严重后果?
  11. 【将门创投】这12张图生动地告诉你,深度学习中的卷积网络是怎么一回事?...
  12. java怎么手动回收内存吗_java基本功16课:(4)Java的内存回收
  13. 宝塔面板修改默认的放行端口8888为8001并且生效
  14. 游戏服务器主程白皮书-序言
  15. 协同过滤(collaborative filtering)
  16. Java 解压缩各种格式
  17. pod的调度策略、定向调度、亲和性调度、污点、容忍污点
  18. iOS音视频开发十三:视频渲染,用 Metal 渲染
  19. 什么是“网络空间安全”?这个行业就业方面如何?
  20. 数据中的知识发现KDD和机器学习概念

热门文章

  1. 【BZOJ2038】小Z的袜子,第一次的莫队算法
  2. 提出邀请Do you want..._43
  3. mysql生产应用_MySQL备份利器之Xtrabackup--生产应用
  4. 自走棋电脑版_手游版《自走棋》上线试玩
  5. 【英语学习】【English L06】U06 Banking L5 I'd like to change Chinese *yuan* into pounds
  6. 职称计算机excel2015年,【2015年职称计算机Excel重点精讲:创建数据透视表】- 环球网校...
  7. window.open怎么设置title_企业seo怎么优化 都有那些策略?
  8. python操作hive表_python处理数据,存进hive表的方法
  9. Unity中的layer和tag
  10. SPH(光滑粒子流体动力学)流体模拟实现三:Marching Cube算法(2)