引言
图形与图像绘制支持是一个gui框架库的核心模块之一,从java的graphics2d到android的canvas类支持到pyqt5中的qpainter类支持与图元支持,都很好的满足了gui库的图形绘制与渲染需求。
qpainter类介绍
qpainter类是pyqt5中图形绘制类,支持圆、椭圆、矩形、圆角矩形、线段、文本、图像、多边形、弧形等常见几何形状的绘制与填充,支持颜色、旋转、状态复位、平移、错切等设置操作。所有的qwidget类都继承了paintevent方法,绘制代码都应该在paintevent方法中完成执行。一个典型的paintevent方法绘制代码如下:
def paintevent(self, paintevent): painter = qpainter(self) painter.setpen(qt.blue) painter.setfont(qfont(arial, 30)) painter.drawtext(rect(), qt.aligncenter, opencv学堂)上述代码首先获取画笔,然后设置颜色与字体,最后绘制文本。通过用户创建painter实例的方式绘制,绘制结束之后需要显式销毁,通过系统的painter绘制则无需这样,对比如下: 用户创建绘制def paintevent(self, paintevent): p = qpainter() p.begin(self) p.drawline(...) # drawing code p.end()
调用系统绘制
def paintevent(self, paintevent): p = qpainter(self) p.drawline(...) # drawing code所有绘制的函数支持都是draw开头,所有填充的函数都是fill开头,什么绘制与填充,请看下图:
综合代码演示
代码实现了绘制与填充不同的几何形状,支持不同颜色设置,线宽设置,风格设置等。运行结果如下图:
添加上显示图像功能之后如下:
相关自定义绘制类代码如下:
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)1112 def paintevent(self, event):13 painter = qtgui.qpainter(self)14 # 设置为反锯齿15 painter.setrenderhint(qtgui.qpainter.antialiasing)1617 # 填充黑色背景18 painter.fillrect(self.rect(), qtcore.qt.black)1920 # 绘制图像21 pic = qtgui.qpixmap(test3.png)22 painter.drawpixmap(self.rect(), pic)2324 # 设置字体与颜色,绘制文本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学堂)3233 # 5表示线宽34 pen = qtgui.qpen(qtcore.qt.red, 5, qtcore.qt.dashline)35 painter.setpen(pen)36 painter.drawline(50, 100, 50, 400)3738 # 绘制矩形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)4344 # 绘制圆45 pen = qtgui.qpen(qtcore.qt.red, 5, qtcore.qt.dotline)46 painter.setpen(pen)4748 # 设置为填充模式49 painter.setbrush(qtgui.qbrush(qtcore.qt.yellow, qtcore.qt.solidpattern))5051 # 直接绘制52 painter.drawellipse(qtcore.qrect(300, 300, 150, 150))5354 # 贝塞尔曲线55 painter.setbrush(qtgui.qbrush(qtcore.qt.red, qtcore.qt.solidpattern))56 self.drawbeziercurve(painter)5758 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)
什么是业务补偿?业务补偿设计的实现方式
为什么CAN总线支线长度不能太长?CAN网络中支线过长的解决方案
苹果新品即将亮相,PCB/FPC供应链乐呵呵
基于虚拟仪器技术和NRF24L01实现水产养殖无线监测系统的设计
运算放大器参数:每个设计人员都需要知道的
PyQT5中的QPainter类支持与图元支持实现图形绘制
谷东科技与英特尔就面向工业元宇宙生态建设达成战略合作协议
中国计划到2030年成为主要的AI创新大国
VCA610典型超声波应用电路
C语言技巧之回调函数
高级自动驾驶汽车部署的实际挑战
飞凌嵌入式i.MX9352开发板,让通信安全又稳定
中国为什么要大力发展5G网络
5G赋能工业互联网是支撑制造业高质量发展的必然要求
芯片供应短缺或持续至2021下半年
电源模块N+k工作方式对电源系统可靠性的影响
新款奥迪Q3 35TFSI全方位测评
咪咕互娱当选5G云游戏产业联盟理事长单位
苹果或在下一代iPhone中增加室内定位服务
你能分的清电子测量仪器的通讯接口吗?猜你肯定分不清哪些是哪些