<p> 引言</p>
讯享网
讯享网 图形与图像绘制支持是一个GUI框架库的核心模块之一,从Java的Graphics2D到Android的Canvas类支持到PyQT5中的QPainter类支持与图元支持,都很好的满足了GUI库的图形绘制与渲染需求。</p> QPainter类介绍</p> 讯享网QPainter类是PyQT5中图形绘制类,支持圆、椭圆、矩形、圆角矩形、线段、文本、图像、多边形、弧形等常见几何形状的绘制与填充,支持颜色、旋转、状态复位、平移、错切等设置操作。所有的QWidget类都继承了paintEvent方法,绘制代码都应该在paintEvent方法中完成执行。一个典型的paintEvent方法绘制代码如下:</p> </p> 讯享网 def paintEvent(self, paintEvent):
painter = QPainter(self) painter.setPen(Qt.blue) painter.setFont(QFont("Arial", 30)) painter.drawText(rect(), Qt.AlignCenter, "OpenCV学堂")</pre> 上述代码首先获取画笔,然后设置颜色与字体,最后绘制文本。通过用户创建Painter实例的方式绘制,绘制结束之后需要显式销毁,通过系统的painter绘制则无需这样,对比如下: 用户创建绘制
讯享网 def paintEvent(self, paintEvent):
p = QPainter() p.begin(self) p.drawLine(...) # drawing code p.end()</pre> 讯享网 </p> <strong>调用系统绘制</strong></p> 讯享网 </p> def paintEvent(self, paintEvent):
讯享网p = QPainter(self) p.drawLine(...) # drawing code</pre> 所有绘制的函数支持都是draw开头,所有填充的函数都是fill开头,什么绘制与填充,请看下图:
</p> 讯享网综合代码演示</p> 代码实现了绘制与填充不同的几何形状,支持不同颜色设置,线宽设置,风格设置等。运行结果如下图:</p> 讯享网<img src='https://file1.elecfans.com//web2/M00/98/6A/wKgZomTnXlWANS2vAABBS6v_zHc354.png' alt='pyqt5' /></p> 添加上显示图像功能之后如下:</p> 讯享网<img src='https://file1.elecfans.com//web2/M00/98/6A/wKgZomTnXlWAbaDTAAZp125mn0k845.png' alt='pyqt5' /></p> <strong>相关自定义绘制类代码如下:</strong></p> 讯享网 </p> 1from PyQt5 import QtWidgets 2from PyQt5 import QtGui 3from PyQt5 import QtCore 4import sys 5 6 7class MyCustomCanvas(QtWidgets.QWidget): 8 def init(self): 9 super().init() 10 print(“create my custom canvas”) 11 12 def paintEvent(self, event): 13 painter = QtGui.QPainter(self) 14 # 设置为反锯齿 15 painter.setRenderHint(QtGui.QPainter.Antialiasing) 16 17 # 填充黑色背景 18 painter.fillRect(self.rect(), QtCore.Qt.black) 19 20 # 绘制图像 21 pic = QtGui.QPixmap(“test3.png”) 22 painter.drawPixmap(self.rect(), pic) 23 24 # 设置字体与颜色,绘制文本 25 pen = QtGui.QPen(QtCore.Qt.green, 5, QtCore.Qt.DashLine) 26 painter.setPen(pen) 27 font = QtGui.QFont() 28 font.setBold(True) 29 font.setPointSizeF(24) 30 painter.setFont(font) 31 painter.drawText(QtCore.QPoint(20, 50), ”OpenCV学堂”) 32 33 # 5表示线宽 34 pen = QtGui.QPen(QtCore.Qt.red, 5, QtCore.Qt.DashLine) 35 painter.setPen(pen) 36 painter.drawLine(50, 100, 50, 400) 37 38 # 绘制矩形 39 pen = QtGui.QPen(QtCore.Qt.yellow, 5, QtCore.Qt.DotLine) 40 painter.setPen(pen) 41 painter.drawRect(QtCore.QRect(100, 100, 200, 200)) 42 painter.fillRect(100, 100, 200, 200, QtCore.Qt.green) 43 44 # 绘制圆 45 pen = QtGui.QPen(QtCore.Qt.red, 5, QtCore.Qt.DotLine) 46 painter.setPen(pen) 47 48 # 设置为填充模式 49 painter.setBrush(QtGui.QBrush(QtCore.Qt.yellow, QtCore.Qt.SolidPattern)) 50 51 # 直接绘制 52 painter.drawEllipse(QtCore.QRect(300, 300, 150, 150)) 53 54 # 贝塞尔曲线 55 painter.setBrush(QtGui.QBrush(QtCore.Qt.red, QtCore.Qt.SolidPattern)) 56 self.drawBezierCurve(painter) 57 58 def drawBezierCurve(self, qp): 59 path = QtGui.QPainterPath() 60 path.moveTo(450, 100) 61 path.cubicTo(450, 100, 550, 200, 450, 350) 62 qp.drawPath(path)
讯享网 </p> <br /><br /><br /><br /><br /> 审核编辑:刘清</p>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/183515.html