舞台灯光网站建设转塘有做网站的吗
2026/1/14 16:54:45 网站建设 项目流程
舞台灯光网站建设,转塘有做网站的吗,网络推广话术开场白,安徽企业平台网站建设文章目录前言一、窗口绘图类#xff08;QPainter 类#xff09; 简介1.QPainter - 绘图引擎2.基础概念和结构3.QPainter绘图方法一览二、QPen 和 QBrush1.QPen - 轮廓绘制2.QBrush - 填充绘制三、QPainter 在 QWidget 上绘图#xff08;实时交互#xff09;1.实操应用2.使用…文章目录前言一、窗口绘图类QPainter 类 简介1.QPainter - 绘图引擎2.基础概念和结构3.QPainter绘图方法一览二、QPen 和 QBrush1.QPen - 轮廓绘制2.QBrush - 填充绘制三、QPainter 在 QWidget 上绘图实时交互1.实操应用2.使用提升部件Promoted Widget总结前言前面一节主要介绍了QImage、QPixmap、QBitmap 和 QPicture 四个图像核心类的基础用法和大体的使用场景还有相关的图像处理和界面显示。但是当图像处理的结果需要显示在图像上并且绘制一些 ROI 在图像上便于跟用户进行深度的交互显示此时改使用什么类来处理呢针对上述的应用场景一般可以通过 QPainter 实现绘制功能这节主要讲解 QPainter 类的相关应用。一、窗口绘图类QPainter 类 简介1.QPainter - 绘图引擎QPainter 是 Qt 中的绘图引擎负责在所有 QPaintDevice 子类上执行绘图操作。QPaintDevice所有可以绘制的对象的基类包括QWidget 、QImage 、QPixmap、QBitmap、QPicture。也即是 QPainter 类可以把 QWidget 、QImage 、QPixmap、QBitmap、QPicture 五个类当作画布QPaintDevice 子类可以在上面执行各种的操作比如可以绘制矩形框、绘制Text文字、绘制圆弧等等诸多图形。2.基础概念和结构QPainter 是 PySide6 图形系统的核心引擎你可以将其理解为一个智能的“画家”而它作画的“画布”可以是屏幕上的窗口部件QWidget、内存中的图像QImage/QPixmap甚至是打印机的页面。下图清晰地展示了 QPainter 作为“状态机”的核心工作机制以及它与绘图工具、绘图设备的关系可以从上述工作机制上大体理解为QPainter 是“画家”执笔的手QPen 是勾勒轮廓的笔尖QBrush 是填充内部的颜料桶。3.QPainter绘图方法一览类别常用方法说明基本形状drawPoint(), drawLine(), drawRect(),drawEllipse(), drawArc(), drawPie()绘制点、线、矩形、椭圆、圆弧、扇形等基本几何形状。多边形/路径drawPolygon(), drawPolyline(),drawPath(QPainterPath)绘制多边形、折线以及由直线和曲线组成的任意复杂路径。文本drawText()在指定位置绘制文本外观由 setFont() 设置的字体决定。图像drawPixmap(), drawImage()在画布上绘制 QPixmap 或 QImage 图像。坐标变换translate(), rotate(), scale(),shear()移动、旋转、缩放、扭曲整个坐标系。结合 save()/restore() 管理状态。视图/窗口setViewport(), setWindow()建立逻辑坐标到物理坐标的映射实现“自适应”绘图。二、QPen 和 QBrush从 QPainter 作为“状态机”的核心工作机制中可以确定作为工具的 QPen 类、QBrush 类、QFont 类是非常重要的值得详细了解QFont 类前面章节已经着重介绍这里不再赘述。1.QPen - 轮廓绘制QPen 是 PySide6 中用于控制图形轮廓线条绘制样式的核心类。你可以把它想象成一支可以自定义的“笔”用它来勾勒任何形状的边缘。它的主要职责是定义线条的颜色、粗细、样式实线/虚线以及线条端点和连接处的形态。①QPen 核心属性详解属性说明常用值/方法可视化效果颜色线条颜色QPen(QColor(“red”))setColor(QColor(255,0,0))setBrush() (渐变/纹理线条)纯色、渐变或纹理宽度线条粗细像素setWidth(2)setWidthF(1.5) (浮点数)细线(1px)、粗线(3px)样式线条样式实线/虚线等setStyle(Qt.SolidLine)setStyle(Qt.DashLine)Qt.DotLine, Qt.DashDotLine───── , ─ ─ ─ , ··· , ─·─·端点样式线条两端形状setCapStyle(Qt.FlatCap)setCapStyle(Qt.SquareCap)setCapStyle(Qt.RoundCap)平头、方头、圆头连接样式折线拐角处形状setJoinStyle(Qt.MiterJoin)setJoinStyle(Qt.BevelJoin)setJoinStyle(Qt.RoundJoin)尖角、斜角、圆角自定义虚线自定义虚线模式setDashPattern([实线长, 间距, …])可任意定义的虚线②QPen 是 PySide6 绘图系统中的轮廓定义专家掌握它的关键在于理解1五大核心属性颜色、宽度、样式、端点、连接2性能优先重用 QPen 对象避免频繁创建3场景适配根据具体应用选择合适的画笔设置4高级特性渐变画笔、自定义虚线等可以实现特殊效果。2.QBrush - 填充绘制QBrush 是 PySide6 中用于定义图形填充方式的核心类它相当于一个“颜料桶”决定了如何填充由 QPen 勾勒出轮廓的形状内部区域。①QBrush 核心填充样式详解填充样式说明创建方法示例适用场景纯色填充单一颜色填充可设置透明度QBrush(QColor(“red”))QBrush(QColor(255,0,0,128)) (半透明)简单图形、UI元素、基础形状线性渐变沿直线方向颜色平滑过渡QBrush(QLinearGradient(…))按钮高光、背景、现代UI设计径向渐变从中心向外辐射状颜色过渡QBrush(QRadialGradient(…))球体、光源效果、圆形高光锥形渐变围绕中心点旋转的颜色过渡QBrush(QConicalGradient(…))雷达图、色轮、特殊指示器纹理填充使用图像作为填充纹理QBrush(QPixmap(“texture.png”))背景图案、材质模拟图案填充预定义图案斜线、网格等QBrush(Qt.CrossPattern)图表背景、区分区域、示意图②QBrush 是 PySide6 绘图系统中的填充艺术家通过掌握它的多种填充方式1六大填充样式纯色、线性渐变、径向渐变、锥形渐变、纹理、图案2性能优先在init中创建并重用 QBrush 对象3场景适配为不同应用场景选择合适的填充方式4高级技巧复合填充、动态画刷、透明度控制。③QBrush 与 QPen轮廓、QPainter绘制引擎共同构成了 PySide6 强大的 2D 图形系统。合理使用 QBrush 可以极大地提升应用程序的视觉吸引力从简单的界面元素到复杂的数据可视化都能找到它的用武之地。三、QPainter 在 QWidget 上绘图实时交互前面说过QPainter 类可以把 QWidget 、QImage 、QPixmap、QBitmap、QPicture 五个类当作画布然后在上面进行绘图现先在 QWidget 上 绘制一个时钟并增加 开始 、停止按钮。1.实操应用classCustomClockWidget(QWidget):在 QWidget 上绘制模拟时钟def__init__(self,parentNone):super().__init__(parent)self.setMinimumSize(300,300)# 创建定时器每秒更新一次self.timerQTimer(self)self.timer.timeout.connect(self.update)self.timer.start(1000)# 每秒触发一次defpaintEvent(self,event):painterQPainter(self)painter.setRenderHint(QPainter.RenderHint.Antialiasing)# 启用抗锯齿# 获取当前时间nowdatetime.now()hournow.hour%12minutenow.minute secondnow.second# 设置钟表中心和半径centerQPoint(self.width()//2,self.height()//2)radiusmin(self.width(),self.height())//2-10# 绘制钟表背景渐变效果gradientQRadialGradient(center,radius,center)gradient.setColorAt(0,QColor(245,245,245))gradient.setColorAt(1,QColor(200,200,200))painter.setBrush(QBrush(gradient))painter.setPen(QPen(Qt.GlobalColor.black,2))painter.drawEllipse(center,radius,radius)# 绘制小时刻度painter.setPen(QPen(Qt.GlobalColor.black,3))foriinrange(12):angle(i*30)*math.pi/180x1center.x()(radius-20)*math.sin(angle)y1center.y()-(radius-20)*math.cos(angle)x2center.x()(radius-5)*math.sin(angle)y2center.y()-(radius-5)*math.cos(angle)painter.drawLine(int(x1),int(y1),int(x2),int(y2))# 绘制小时数字x_textcenter.x()(radius-40)*math.sin(angle)y_textcenter.y()-(radius-40)*math.cos(angle)painter.setFont(QFont(Arial,12,QFont.Weight.Bold))painter.drawText(int(x_text)-10,int(y_text)5,f{ior12})# 绘制分钟刻度painter.setPen(QPen(Qt.GlobalColor.gray,1))foriinrange(60):ifi%5!0:# 跳过小时刻度位置angle(i*6)*math.pi/180x1center.x()(radius-15)*math.sin(angle)y1center.y()-(radius-15)*math.cos(angle)x2center.x()(radius-5)*math.sin(angle)y2center.y()-(radius-5)*math.cos(angle)painter.drawLine(int(x1),int(y1),int(x2),int(y2))# 绘制时针hour_angle(hour*30minute*0.5)*math.pi/180hour_hand_lengthradius*0.5painter.setPen(QPen(Qt.GlobalColor.black,6))painter.drawLine(center.x(),center.y(),int(center.x()hour_hand_length*math.sin(hour_angle)),int(center.y()-hour_hand_length*math.cos(hour_angle)))# 绘制分针minute_angle(minute*6)*math.pi/180minute_hand_lengthradius*0.7painter.setPen(QPen(Qt.GlobalColor.darkBlue,4))painter.drawLine(center.x(),center.y(),int(center.x()minute_hand_length*math.sin(minute_angle)),int(center.y()-minute_hand_length*math.cos(minute_angle)))# 绘制秒针second_angle(second*6)*math.pi/180second_hand_lengthradius*0.8painter.setPen(QPen(Qt.GlobalColor.red,2))painter.drawLine(center.x(),center.y(),int(center.x()second_hand_length*math.sin(second_angle)),int(center.y()-second_hand_length*math.cos(second_angle)))# 绘制中心点painter.setBrush(QBrush(Qt.GlobalColor.red))painter.setPen(QPen(Qt.GlobalColor.black,1))painter.drawEllipse(center,6,6)# 显示数字时间painter.setPen(Qt.GlobalColor.black)painter.setFont(QFont(Arial,20))time_strnow.strftime(%H:%M:%S)painter.drawText(center.x()-55,center.y()radius-65,time_str)classMyWindow(QMainWindow):# 这里的继承的父类一定要注意使用你定义UI窗体类型def__init__(self):super().__init__()# 实例化 ui.py 文件中的UI窗体类self.uiUi_MainWindow02()# 使用 Ui_MainWindow 中的 setupUi 方法给当前窗体加载 ui 界面self.ui.setupUi(self)self.paint_widgetCustomClockWidget()# 创建自定义绘图部件self.ui.m_widget.setParent(None)# 移除原widgetself.ui.verticalLayout.addWidget(self.paint_widget)# 添加自定义widget到相同位置# 槽函数self.ui.btn_Start.clicked.connect(self.start_clock)self.ui.btn_Stop.clicked.connect(self.stop_clock)defstart_clock(self):启动时钟self.paint_widget.timer.start(1000)self.paint_widget.update()defstop_clock(self):暂停时钟self.paint_widget.timer.stop()①大体流程先创建一个自定义的 QWidget 子类即 class CustomClockWidget(QWidget) 然后重写 QWidget 的 paintEvent 方法在 paintEvent 中使用 QPainter 绘制图像最后在主程序中进行自定义类 CustomClockWidget 的调用② 首先 CustomClockWidget 类中根据外部传入的 QWidget 的长宽进行确认表盘的中心点和半径③绘制钟表背景的时候由于需要进行背景颜色填充所以 painter.setBrush(QBrush(gradient))、painter.setPen(QPen(Qt.GlobalColor.black, 2)) 进行了 QPen 和 QBrush 的设置。然后 painter.drawEllipse(center, radius, radius) QPainter 类进行椭圆的绘制④接着是时间刻度和根据获取到的时间进行时针、分针和秒针的绘制可以参考例程进行分析这里不做赘述⑤后续是 painter.drawText 函数进行 Text 文字的绘制⑥上述常用的绘制类型都在这例程一 一展示流程基本一致先进行 QPen 类、QBrush 类、QFont 类的配置然后根据需要的内容进行调整然后通过 QPainter 类执行绘制指令最后通过主程序的调用进行绘制图的显示。注意点可以从上述主程序代码中看到自定义的 QWidget 子类用法是 先进行 CustomClockWidget() 创建自定义绘图部件然后通过 setParent(None) 函数移除在 UI 界面创建的 Qwidget 控件最后 self.ui.verticalLayout.addWidget(self.paint_widget) 通过 addWidget() 函数把创建的子类替换到 UI 界面相同的位置。针对上述的用法还可以通过替代方案使用提升部件Promoted Widget方式。2.使用提升部件Promoted Widget使用提升部件Promoted Widget是 Qt Designer 中最优雅的集成自定义控件的方法。这种方法允许你在 Qt Designer 中直接使用自定义控件而不是在代码中替换这种方式在实际应用中很常用建议后续都通过这种方式使用自定义的类很重要①将自定义类的代码拷贝到一个新建的 py 文件中并命名为 custom_clock_widget.py ②在 Qt Designer 界面选中需要的 QWidget 控件右键选择提升为… ③输入提升的类名称CustomClockWidget 、头文件custom_clock_widget或完整路径点击添加然后选中提升的类点击提升最后就能发现对象检测器栏中类名就变成 CustomClockWidget 了此时部件就提升完成了可以直接在主函数中进行使用④直接调用 self.ui.m_widget 此时 m_widget 继承了 CustomClockWidget 类的函数和对象总结掌握 QPainter、QPen 和 QBrush 是进行 PySide6 自定义绘图的关键①QPainter 是指挥官负责执行所有绘制命令②QPen 是轮廓设计师控制所有线条相关属性③QBrush 是填充艺术家管理图形内部的填充效果三者协同工作可以创建从简单的几何图形到复杂的自定义控件和数据可视化图表。理解它们各自的分工和配合方式将使你能够充分发挥 PySide6 强大的 2D 图形绘制能力。本节也对于在 QWidget 类上进行绘图进行了一个基础的讲解其中 使用提升部件Promoted Widget功能应用很重要后续会接着对 QPainter 类在 QPixmap、QBitmap、QPicture 上的应用做个详细的讲解。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询