这个例子我做了好几天:

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

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

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

【知识点】

1、关于多个点的使用

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

请看:

 1      # 定义多个点
 2      points = [QPoint(10, 80), QPoint(20, 10), QPoint(80, 30), QPoint(90, 70)]
 3
 4      # ===直接使用 points 会报错!=========
 5      # ...
 6      elif self.shape == self.Points:
 7            painter.drawPoints(points)
 8
 9      elif self.shape == self.Polyline:
10            painter.drawPolyline(points)
11
12      elif self.shape == self.Polygon:
13            painter.drawPolygon(points, 4)
14
15      # ...
16
17      # ===把 points 用 QPolygon()包裹起来才正确!=========
18      # ...
19      elif self.shape == self.Points:
20            painter.drawPoints(QPolygon(points))
21
22      elif self.shape == self.Polyline:
23            painter.drawPolyline(QPolygon(points))
24
25      elif self.shape == self.Polygon:
26            painter.drawPolygon(QPolygon(points), 4)
27
28      # ...

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

【效果图】

【资源】

http://doc.qt.io/qt-5/images/used-in-examples/painting/basicdrawing/images/brick.png

http://doc.qt.io/qt-5/images/used-in-examples/painting/basicdrawing/images/qt-logo.png

【代码】

import sysfrom 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=0contentCol=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 = sself.update()def setPen(self,p):self.pen = pself.update()def setBrush(self,b):self.brush = bself.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 * 16spanAngle = 120 * 16path = 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_()

(罗兵 作于2015.02.05     01:58)

本文转自罗兵博客园博客,原文链接:http://www.cnblogs.com/hhh5460/p/4273799.html,如需转载请自行联系原作者

PyQt5利用QPainter绘制各种图形相关推荐

  1. QT基础之一文介绍QPainter绘制基础图形(画笔画刷设置,填充铺展渐变效果)

    更多参见 QT基础与实例应用目录 代码链接 GitHub链接 :QPainterSimpleExample 介绍 结合实例介绍如何利用QPainter绘制各种图形,可绘制不同形状,使用不同画笔颜色.画 ...

  2. pyqt5使用QPainter绘制坐标轴并显示散点图

    pyqt5使用QPainter绘制坐标轴并显示散点图 1.效果图 2.代码 from PyQt5.Qt import * import sys, randomclass DrawPoints(QWid ...

  3. Python matplotlib入门级绘制图形(一)--利用plot()绘制简单图形

    目录 序 简介 组成元素 plot()--展现变量的变化趋势 设置坐标轴样式(label,ticks,lim等的设置) plt.grid()--设置网格 绘制参考线与参考域(axvline()与axs ...

  4. java画布制作弧形文字_QT 使用QPainter 绘制图形 和 世界变换 world transform

    1. 绘制椭圆  饼状型 贝塞尔曲线 绘制图像重写方法 void paintEvent(QPaintEvent *event)即可. void Widget::paintEvent(QPaintEve ...

  5. iOS - 利用 UIBezierPath 绘制圆弧

    前言 最近要写个「会话气泡」,由于没有找到合适的背景图片,所以需要直接用 UIBezierPath 进行绘制.期间用到之前还不太熟悉的绘制圆弧相关知识,于是写下此文进行记录. API 浅析 UIBez ...

  6. 计算机图形学:实验二——OpenGL绘制基本图形

    1. 实验目的 练习OpenGL基础编程,实现OpenGL的颜色混合和渐变效果. 2. 实验内容和要求 按要求完成以下两个绘图,提交纸质实验报告,同时提交实验报告和代码的电子版. I). 利用Open ...

  7. 【Android】PorterDuffXfermode使用(通过消除背景层与重叠部分绘制组合图形)

    利用PorterDuffXfermode,绘制组合图形,过程我分成了4个步骤(onDraw方法里面): 1.通过canvas.saveLayout()先绘制一个背景图层(这里位置大小很重要,应该根据覆 ...

  8. 用计算机绘制机械图样,利用AutoCAD绘制机械图样中的几个问题

    AutoCAD相关论文 第28卷第2期煤 矿 机 械 2007年 2月CoalMineMachinery Feb. Vol128No12 2007 利用AutoCAD绘制机械图样中的几个问题 郑伯学, ...

  9. 利用QPainter基本函数+rotate/translate绘制旋转图形的方法

    通常利用QPainter的drawXXX函数绘制的图形都是不带旋转的,而QPainter的rotate函数解释如下: void QPainter::rotate(qrealangle) Rotates ...

最新文章

  1. JQuery 的部分高级语法
  2. Jquery UI dialog 详解 (中文)
  3. Oracle笔记 八、PL/SQL跳转/判断/循环语句块
  4. 第一阶段冲刺 第二天
  5. 2019牛客多校Monotonic Matrix
  6. HTML网页使用CDN的jquery.qrcode.min.js生成页面二维码(直接可以复制使用)
  7. 服务器芯片组c621,三路千兆LAN:GIGABYTE 技嘉 发布 C621-SU8 服务器主板
  8. vs2015professional过期后登录微软账户仍然不能使用的解决方法
  9. 突击计划——求整数中的较大者
  10. 互联网公司分批返岗;Safari 将封杀超过398天的 HTTPS 证书;TypeScript 3.8 发布 | 极客头条...
  11. i510200h和i78750h哪个好?有什么区别
  12. vc开发记牌器的两种思路
  13. ios 图片居中裁剪_iOS 自定义裁剪相册照片
  14. 触摸传递 Touch Delivery
  15. 【点赞收藏】36个顶级数据分析方法与模型!
  16. web前端开发工程师的竞争力体现在哪里?
  17. 【dva】dva使用与实现(七)
  18. tewa-800g请输入正确的管理员账户_tp-link路由器如何设置管理员身份绑定 路由器设置管理员身份绑定方法【介绍】...
  19. Linux Device tree(二) - DT分析
  20. 【iOS-iap防护】验证用户付费收据!拒绝iap Cracker!拒绝iap Free!让iphone越狱用户无从下手!【2012年5月2日更新防护iap Free的方法】

热门文章

  1. python配置核_浅谈pytorch卷积核大小的设置对全连接神经元的影响
  2. 咸宁书写桂花产业-国情研究·万祥军:特色农业谋定大健康
  3. VUE初长成【部分小记】
  4. 2019做的第一个艰难决定
  5. mysql数据库优化的几种方法
  6. 闭包(匿名函数) php
  7. 错误日志的实时抓取保证代码质量
  8. maven package 知识(转载)
  9. 粗浅理解html5中canvas transform()和settransform()方法
  10. shmdt() 与 shmctl() 的区别