PyQt5利用QPainter绘制各种图形的实例


Posted in Python onOctober 19, 2017

这个例子我做了好几天:

1)官网C++的源码,改写成PyQt5版本的代码,好多细节不会转化

2)网上的PyQt的例子根本运行不了

填了无数个坑,结合二者,终于能完成了一个关于绘图的东西。这个过程也掌握了很多新的知识点

【知识点】

1、关于多个点的使用

poitns = [QPoint(10, 80), QPoint(20, 10), QPoint(80, 30), QPoint(90, 70)]

请看:

# 定义多个点
   points = [QPoint(10, 80), QPoint(20, 10), QPoint(80, 30), QPoint(90, 70)]

   # ===直接使用 points 会报错!=========
   # ...
   elif self.shape == self.Points:
      painter.drawPoints(points)

   elif self.shape == self.Polyline:
      painter.drawPolyline(points)

   elif self.shape == self.Polygon:
      painter.drawPolygon(points, 4)

   # ...

   # ===把 points 用 QPolygon()包裹起来才正确!=========
   # ...
   elif self.shape == self.Points:
      painter.drawPoints(QPolygon(points))

   elif self.shape == self.Polyline:
      painter.drawPolyline(QPolygon(points))

   elif self.shape == self.Polygon:
      painter.drawPolygon(QPolygon(points), 4)

   # ...

2、在QDialog窗体中显示QWidget部件

【效果图】

PyQt5利用QPainter绘制各种图形的实例PyQt5利用QPainter绘制各种图形的实例

【资源】

//img.jbzj.com/file_images/article/201710/brick.png
//img.jbzj.com/file_images/article/201710/qt-logo.png

【代码】

import sys

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class StockDialog(QWidget):
  def __init__(self, parent=None):
    super(StockDialog, self).__init__(parent)
    self.setWindowTitle("利用QPainter绘制各种图形")
    
    mainSplitter = QSplitter(Qt.Horizontal)
    mainSplitter.setOpaqueResize(True)
         
    frame = QFrame(mainSplitter)
    mainLayout = QGridLayout(frame)
    #mainLayout.setMargin(10)
    mainLayout.setSpacing(6)

    label1=QLabel("形状:")
    label2=QLabel("画笔线宽:")
    label3=QLabel("画笔颜色:")
    label4=QLabel("画笔风格:")
    label5=QLabel("画笔顶端:")
    label6=QLabel("画笔连接点:")
    label7=QLabel("画刷风格:")
    label8=QLabel("画刷颜色:")
  
    self.shapeComboBox = QComboBox()
    self.shapeComboBox.addItem("Line", "Line")
    self.shapeComboBox.addItem("Rectangle", "Rectangle")
    self.shapeComboBox.addItem('Rounded Rectangle','Rounded Rectangle')
    self.shapeComboBox.addItem('Ellipse','Ellipse')
    self.shapeComboBox.addItem('Pie','Pie')
    self.shapeComboBox.addItem('Chord','Chord')
    self.shapeComboBox.addItem('Path','Path')
    self.shapeComboBox.addItem('Polygon','Polygon')
    self.shapeComboBox.addItem('Polyline','Polyline')
    self.shapeComboBox.addItem('Arc','Arc')
    self.shapeComboBox.addItem('Points','Points')
    self.shapeComboBox.addItem('Text','Text')
    self.shapeComboBox.addItem('Pixmap','Pixmap')
    
    self.widthSpinBox = QSpinBox()
    self.widthSpinBox.setRange(0,20)
    
    self.penColorFrame = QFrame()
    self.penColorFrame.setAutoFillBackground(True)
    self.penColorFrame.setPalette(QPalette(Qt.blue))
    self.penColorPushButton = QPushButton("更改")
    
    self.penStyleComboBox = QComboBox()
    self.penStyleComboBox.addItem("Solid",Qt.SolidLine)
    self.penStyleComboBox.addItem('Dash', Qt.DashLine)
    self.penStyleComboBox.addItem('Dot', Qt.DotLine)
    self.penStyleComboBox.addItem('Dash Dot', Qt.DashDotLine)
    self.penStyleComboBox.addItem('Dash Dot Dot', Qt.DashDotDotLine)
    self.penStyleComboBox.addItem('None', Qt.NoPen)
    
    self.penCapComboBox = QComboBox()
    self.penCapComboBox.addItem("Flat",Qt.FlatCap)
    self.penCapComboBox.addItem('Square', Qt.SquareCap)
    self.penCapComboBox.addItem('Round', Qt.RoundCap)
    
    self.penJoinComboBox = QComboBox()
    self.penJoinComboBox.addItem("Miter",Qt.MiterJoin)
    self.penJoinComboBox.addItem('Bebel', Qt.BevelJoin)
    self.penJoinComboBox.addItem('Round', Qt.RoundJoin)
    
    self.brushStyleComboBox = QComboBox()
    self.brushStyleComboBox.addItem("Linear Gradient",Qt.LinearGradientPattern)
    self.brushStyleComboBox.addItem('Radial Gradient', Qt.RadialGradientPattern)
    self.brushStyleComboBox.addItem('Conical Gradient', Qt.ConicalGradientPattern)
    self.brushStyleComboBox.addItem('Texture', Qt.TexturePattern)
    self.brushStyleComboBox.addItem('Solid', Qt.SolidPattern)
    self.brushStyleComboBox.addItem('Horizontal', Qt.HorPattern)
    self.brushStyleComboBox.addItem('Vertical', Qt.VerPattern)
    self.brushStyleComboBox.addItem('Cross', Qt.CrossPattern)
    self.brushStyleComboBox.addItem('Backward Diagonal', Qt.BDiagPattern)
    self.brushStyleComboBox.addItem('Forward Diagonal', Qt.FDiagPattern)
    self.brushStyleComboBox.addItem('Diagonal Cross', Qt.DiagCrossPattern)
    self.brushStyleComboBox.addItem('Dense 1', Qt.Dense1Pattern)
    self.brushStyleComboBox.addItem('Dense 2', Qt.Dense2Pattern)
    self.brushStyleComboBox.addItem('Dense 3', Qt.Dense3Pattern)
    self.brushStyleComboBox.addItem('Dense 4', Qt.Dense4Pattern)
    self.brushStyleComboBox.addItem('Dense 5', Qt.Dense5Pattern)
    self.brushStyleComboBox.addItem('Dense 6', Qt.Dense6Pattern)
    self.brushStyleComboBox.addItem('Dense 7', Qt.Dense7Pattern)
    self.brushStyleComboBox.addItem('None', Qt.NoBrush)
    
    self.brushColorFrame = QFrame()
    self.brushColorFrame.setAutoFillBackground(True)
    self.brushColorFrame.setPalette(QPalette(Qt.green))
    self.brushColorPushButton = QPushButton("更改")
                               
    labelCol=0
    contentCol=1
    
    #建立布局
    mainLayout.addWidget(label1,1,labelCol)
    mainLayout.addWidget(self.shapeComboBox,1,contentCol)
    mainLayout.addWidget(label2,2,labelCol)
    mainLayout.addWidget(self.widthSpinBox,2,contentCol)
    mainLayout.addWidget(label3,4,labelCol)
    mainLayout.addWidget(self.penColorFrame,4,contentCol)
    mainLayout.addWidget(self.penColorPushButton,4,3)
    mainLayout.addWidget(label4,6,labelCol)
    mainLayout.addWidget(self.penStyleComboBox,6,contentCol)
    mainLayout.addWidget(label5,8,labelCol)
    mainLayout.addWidget(self.penCapComboBox,8,contentCol)
    mainLayout.addWidget(label6,10,labelCol)
    mainLayout.addWidget(self.penJoinComboBox,10,contentCol)
    mainLayout.addWidget(label7,12,labelCol)
    mainLayout.addWidget(self.brushStyleComboBox,12,contentCol)
    mainLayout.addWidget(label8,14,labelCol)
    mainLayout.addWidget(self.brushColorFrame,14,contentCol)
    mainLayout.addWidget(self.brushColorPushButton,14,3)
    mainSplitter1 = QSplitter(Qt.Horizontal)
    mainSplitter1.setOpaqueResize(True)
    
    stack1 = QStackedWidget()
    stack1.setFrameStyle(QFrame.Panel|QFrame.Raised)
    self.area = PaintArea()
    stack1.addWidget(self.area)    
    frame1 = QFrame(mainSplitter1)
    mainLayout1 = QVBoxLayout(frame1)
    #mainLayout1.setMargin(10)
    mainLayout1.setSpacing(6)
    mainLayout1.addWidget(stack1)

    layout = QGridLayout(self)
    layout.addWidget(mainSplitter1,0,0)
    layout.addWidget(mainSplitter,0,1)
    self.setLayout(layout)
    
    #信号和槽函数
    self.shapeComboBox.activated.connect(self.slotShape)
    self.widthSpinBox.valueChanged.connect(self.slotPenWidth)
    self.penColorPushButton.clicked.connect(self.slotPenColor)
    self.penStyleComboBox.activated.connect(self.slotPenStyle)
    self.penCapComboBox.activated.connect(self.slotPenCap)
    self.penJoinComboBox.activated.connect(self.slotPenJoin)
    self.brushStyleComboBox.activated.connect(self.slotBrush)
    self.brushColorPushButton.clicked.connect(self.slotBrushColor)
    
    self.slotShape(self.shapeComboBox.currentIndex())
    self.slotPenWidth(self.widthSpinBox.value())
    self.slotBrush(self.brushStyleComboBox.currentIndex())    
    
  def slotShape(self,value):
    shape = self.area.Shape[value]
    self.area.setShape(shape)
  
  def slotPenWidth(self,value):
    color = self.penColorFrame.palette().color(QPalette.Window)
    style = Qt.PenStyle(self.penStyleComboBox.itemData(self.penStyleComboBox.currentIndex(),Qt.UserRole))
    cap = Qt.PenCapStyle(self.penCapComboBox.itemData(self.penCapComboBox.currentIndex(),Qt.UserRole))
    join = Qt.PenJoinStyle(self.penJoinComboBox.itemData(self.penJoinComboBox.currentIndex(),Qt.UserRole))
    self.area.setPen(QPen(color,value,style,cap,join))
  
  def slotPenStyle(self,value):
    self.slotPenWidth(value)
  
  def slotPenCap(self,value):
    self.slotPenWidth(value)
  
  def slotPenJoin(self,value):
    self.slotPenWidth(value)
  
  def slotPenColor(self):
    color = QColorDialog.getColor(Qt.blue)
    self.penColorFrame.setPalette(QPalette(color))
    self.area.setPen(QPen(color))
    
  def slotBrushColor(self):
    color = QColorDialog.getColor(Qt.blue)
    self.brushColorFrame.setPalette(QPalette(color))
    self.slotBrush(self.brushStyleComboBox.currentIndex())
  
  def slotBrush(self,value):
    color = self.brushColorFrame.palette().color(QPalette.Window)
    style = Qt.BrushStyle(self.brushStyleComboBox.itemData(value,Qt.UserRole))
    
    if(style == Qt.LinearGradientPattern):
      linearGradient = QLinearGradient(0,0,400,400)
      linearGradient.setColorAt(0.0,Qt.white)
      linearGradient.setColorAt(0.2,color)
      linearGradient.setColorAt(1.0,Qt.black)
      self.area.setBrush(linearGradient)
    elif style ==Qt.RadialGradientPattern:
      radialGradient = QRadialGradient(200, 200, 80, 70, 70);
      radialGradient.setColorAt(0.0, Qt.white)
      radialGradient.setColorAt(0.2, Qt.green)
      radialGradient.setColorAt(1.0, Qt.black)
      self.area.setBrush(radialGradient)
    elif(style == Qt.ConicalGradientPattern):
      conicalGradient = QConicalGradient(200,200,30)
      conicalGradient.setColorAt(0.0,Qt.white)
      conicalGradient.setColorAt(0.2,color)
      conicalGradient.setColorAt(1.0,Qt.black)
      self.area.setBrush(conicalGradient)
    elif(style == Qt.TexturePattern):
      self.area.setBrush(QBrush(QPixmap("images/brick.png")))
    else:
      self.area.setBrush(QBrush(color,style))
    
  
class PaintArea(QWidget):
  def __init__(self):
    super(PaintArea,self).__init__()
    self.Shape = ["Line","Rectangle", 'Rounded Rectangle', "Ellipse", "Pie", 'Chord', 
  "Path","Polygon", "Polyline", "Arc", "Points", "Text", "Pixmap"]
    self.setPalette(QPalette(Qt.white))
    self.setAutoFillBackground(True)
    self.setMinimumSize(400,400)
    self.pen = QPen()
    self.brush = QBrush()    
  
  def setShape(self,s):
    self.shape = s
    self.update()
    
  def setPen(self,p):
    self.pen = p
    self.update()
  
  def setBrush(self,b):
    self.brush = b
    self.update()
  
  def paintEvent(self,QPaintEvent):
    p = QPainter(self)
    p.setPen(self.pen)
    p.setBrush(self.brush)
    
    rect = QRect(50,100,300,200) 
    points = [QPoint(150,100),QPoint(300,150),QPoint(350,250),QPoint(100,300)]
    startAngle = 30 * 16
    spanAngle = 120 * 16
    
    path = QPainterPath();
    path.addRect(150,150,100,100)
    path.moveTo(100,100)
    path.cubicTo(300,100,200,200,300,300)
    path.cubicTo(100,300,200,200,100,100)
    
    if self.shape == "Line":
      p.drawLine(rect.topLeft(),rect.bottomRight())
    elif self.shape == "Rectangle":
      p.drawRect(rect)
    elif self.shape == 'Rounded Rectangle':
      p.drawRoundedRect(rect, 25, 25, Qt.RelativeSize)
    elif self.shape == "Ellipse":
      p.drawEllipse(rect)
    elif self.shape == "Polygon":
      p.drawPolygon(QPolygon(points),Qt.WindingFill)
    elif self.shape == "Polyline":
      p.drawPolyline(QPolygon(points))
    elif self.shape == "Points":
      p.drawPoints(QPolygon(points))
    elif self.shape == "Pie":
      p.drawPie(rect, startAngle, spanAngle)
    elif self.shape == "Arc":
      p.drawArc(rect,startAngle,spanAngle)
    elif self.shape == "Chord":
      p.drawChord(rect, startAngle, spanAngle)
    elif self.shape == "Path":
      p.drawPath(path)
    elif self.shape == "Text":
      p.drawText(rect,Qt.AlignCenter,"Hello Qt!")
    elif self.shape == "Pixmap":
      p.drawPixmap(150,150,QPixmap("images/qt-logo.png"))
    
if __name__=='__main__':
  app = QApplication(sys.argv)
  form = StockDialog()
  form.show()
  app.exec_()

以上这篇PyQt5利用QPainter绘制各种图形的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中for循环详解
Jan 17 Python
把项目从Python2.x移植到Python3.x的经验总结
Apr 20 Python
Python如何判断数独是否合法
Sep 08 Python
Python使用pickle模块存储数据报错解决示例代码
Jan 26 Python
详谈python3中用for循环删除列表中元素的坑
Apr 19 Python
基于python实现文件加密功能
Jan 06 Python
jupyter 中文乱码设置编码格式 避免控制台输出的解决
Apr 20 Python
Python3爬虫发送请求的知识点实例
Jul 30 Python
python time.strptime格式化实例详解
Feb 03 Python
python脚本使用阿里云slb对恶意攻击进行封堵的实现
Feb 04 Python
虚拟环境及venv和virtualenv的区别说明
Feb 05 Python
Flask使用SQLAlchemy实现持久化数据
Jul 16 Python
python连接数据库的方法
Oct 19 #Python
Python3使用PyQt5制作简单的画板/手写板实例
Oct 19 #Python
python里使用正则的findall函数的实例详解
Oct 19 #Python
详解python里使用正则表达式的全匹配功能
Oct 19 #Python
python中logging库的使用总结
Oct 18 #Python
R vs. Python 数据分析中谁与争锋?
Oct 18 #Python
Ubuntu安装Jupyter Notebook教程
Oct 18 #Python
You might like
新浪新闻小偷
2006/10/09 PHP
PHP 面向对象详解
2012/09/13 PHP
本地计算机无法启动Apache故障处理
2014/08/08 PHP
PHP简单实现HTTP和HTTPS跨域共享session解决办法
2015/05/27 PHP
Jquery ThickBox插件使用心得(不建议使用)
2010/09/08 Javascript
JQuery实现点击div以外的位置隐藏该div窗口
2013/09/13 Javascript
如何解决Jquery库及其他库之间的$命名冲突
2013/09/15 Javascript
实现51Map地图接口(示例代码)
2013/11/22 Javascript
jquery禁用右键示例
2014/04/28 Javascript
JavaScript中property和attribute的区别详细介绍
2015/03/03 Javascript
JavaScript中Math.SQRT2属性的使用详解
2015/06/14 Javascript
微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解
2016/12/08 Javascript
基于bootstrap按钮式下拉菜单组件的搜索建议插件
2017/03/25 Javascript
ES6新特性之数组、Math和扩展操作符用法示例
2017/04/01 Javascript
把vue-router和express项目部署到服务器的方法
2018/02/21 Javascript
npm全局模块卸载及默认安装目录修改方法
2018/05/15 Javascript
JavaScript基于数组实现的栈与队列操作示例
2018/12/22 Javascript
Python 不同对象比较大小示例探讨
2014/08/21 Python
python自动化测试之连接几组测试包实例
2014/09/28 Python
Flask框架响应、调度方法和蓝图操作实例分析
2018/07/24 Python
Django 实现购物车功能的示例代码
2018/10/08 Python
Python替换月份为英文缩写的实现方法
2019/07/15 Python
python利用re,bs4,requests模块获取股票数据
2019/07/29 Python
python3正则模块re的使用方法详解
2020/02/11 Python
解决python 找不到module的问题
2020/02/12 Python
html5触摸事件判断滑动方向的实现
2018/06/05 HTML / CSS
2014年十八届四中全会思想汇报范文
2014/10/17 职场文书
违反单位工作制度检讨书
2014/10/25 职场文书
2014年乡镇纪委工作总结
2014/12/19 职场文书
525心理健康活动总结
2015/05/08 职场文书
夫妻吵架保证书
2015/05/08 职场文书
让生命充满爱观后感
2015/06/08 职场文书
标枪加油稿
2015/07/22 职场文书
tensorflow学习笔记之tfrecord文件的生成与读取
2021/03/31 Python
Python将CSV文件转化为HTML文件的操作方法
2021/06/30 Python
mysql连接查询中and与where的区别浅析
2021/07/01 MySQL