pyqt5 QPainter绘制图形,并旋转

news2024/11/17 1:41:34

        PyQt5 的绘图系统使用户可以在屏幕或打印设备上用相同的 API 绘图,QPainter 是用来进行 绘图操作的类,一般的绘图设备包括 QWidget、QPixmap、QImage 等,这些绘图设备为 QPainter 提供了一个“画布”

        QWidget 类是所有界面组件的基类,QWidget 类有一个 paintEvent()事件,在此事件里创建一 个 QPainter 对象获取绘图设备的接口,就可以用 QPainter 对象在绘图设备的“画布”上绘图了。

        在 paintEvent()事件里绘图的基本程序结构是:

def paintEvent(self,event):

        painter=QPainter(self)

        ## painter 在设备的窗口上画图

下面是一个demo,可以参考:

        使图像转动时,使用的是rotate()方法,它是将坐标系统绕坐标原点顺时针旋转角度 angle,单位是度。当 angle 为正数时表示顺时针 旋转,为负数时表示逆时针旋转。转动的原理就是转动坐标系统。

rotate(angle) 坐标系统顺时针旋转一个角度 angle(单位是度)

import sys
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QColor, QFont, QPen, QBrush
from PyQt5.QtCore import Qt, QPointF, QPoint, QRect, QRectF, QTimer


class Drawing(QWidget):
    def __init__(self, parent=None):
        super(Drawing, self).__init__(parent)
        self.setWindowTitle("窗口绘制demo")
        self.resize(600, 500)
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.start)
        self.timer.start(100)
        self.rotate_angle = 0

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing)

        pen = QPen()
        pen.setColor(Qt.black)
        pen.setWidth(40)
        pen.setStyle(Qt.SolidLine)
        pen.setCapStyle(Qt.FlatCap)
        pen.setJoinStyle(Qt.BevelJoin)
        painter.setPen(pen)

        brush = QBrush()
        brush.setColor(Qt.white)
        brush.setStyle(Qt.SolidPattern)
        painter.setBrush(brush)

        # painter.drawRect(0, 0, self.width(), self.height())

        W = self.width()  # 绘图区宽度
        H = self.height()  # 绘图区高度
        painter.translate(W/2, H/2)
        tmp = min(W, H)
        painter.rotate(self.rotate_angle)

        painter.scale(tmp / 1000, tmp / 1000)
        painter.setPen(Qt.NoPen)
        painter.setBrush(Qt.black)
        painter.drawEllipse(QPointF(0, 0), 310, 310)        # 构造函数:原点,半径x, 半径y
        start_angle = 0
        span_angle = 45 * 16

        pie_rect=QRectF(QPointF(-200,-200), QPoint(200,200)) # QRectF(const QPointF &topLeft, const QPointF &bottomRight)

        for x in range(8):
            color = QColor(Qt.red) if x % 2 else QColor(Qt.white)
            painter.setBrush(color)
            painter.drawPie(pie_rect, start_angle, span_angle)
            start_angle += span_angle


    def start(self):
        self.rotate_angle += 30
        if self.rotate_angle == 360:
            self.rotate_angle = 0
        self.update()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Drawing()
    demo.show()
    sys.exit(app.exec_())







上述代码,在画扇形时,span_angle = 45 * 16,这里关于为什么是16,给出解释:

可以参考官网:QPainter Class | Qt GUI 5.15.12

 

参考:

Pyqt5绘制旋转图片_weixin_49577420的博客-CSDN博客_pyqt5 qdockwidget旋转

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/125817.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【细节注入模型】

Detail-Injection-Model-Inspired Deep Fusion Network for Pansharpening (细节注入模型启发的深度融合网络全色锐化算法) 全色锐化是一种图像融合方法,其目的是将低空间分辨率的多光谱(MS)图像与高空间分辨率的全色…

FFmpeg学习笔记--FFplay简单过滤器、FFmpeg命令参数

目录 1--FFplay简单过滤器 2--FFmpeg命令参数 2-1 主要参数 2-1-1 -i设定输入流 2-1-2 -f设定输出格式 2-1-3 -ss设定开始时间 2-1-4 -t设定时间长度 2-1-5 代码实例 2-2 音频参数 2-2-1 -aframes设置输出的音频帧数 2-2-2 -b:a设置音频码率 2-2-3 -ar设置音频采样…

SVG 安全

一 任务目标 本篇文章的目的有:[ ] 了解 SVG 漏洞[ ] 了解 SVG 常见防护手段[ ] 搜寻 SVG 数据安全性校验和过滤的库[ ] 了解如何使用此类库来进行 SVG 上传防护[ ] 阅读源码,能明确讲述此类库做了什么如果对你有所帮助,不妨点赞、评论、收藏…

Windows系统安装Git教程

今天给大家介绍Windows系统安装Git命令。 一、Git版本控制工具简介 git是一个开源的分布式版本控制系统。所谓版本控制系统,是开发者最重要的工具之一,可以有效的解决版本的同步以及不同开发者之家的通信问题,提升协同开发的效率。版本控制…

JAVA数据类型及转换

一、数据类型 数据类型字节数byte字节型占用1个字节取值范围:-27 ~ 27-1-128~127short短整型占用2个字节取值范围:-215 ~ 215-1-32768~32767,在实际开发中使用较少int整型占用4个字节取值范围:-231 ~ 231-1-2147483648-214748364…

大道至简:数据库的终极未来

墨天轮2022年12月份的报告已经出炉,这一期的主题是:大道至简,自治为王。在公众号回复:下载 可以获得各期报告下载链接。数据库的终极未来是什么?这是行业里一直在探讨的命题,复杂但是也简单。大道至简01Or…

硬盘无法格式化怎么解决?数据丢失怎么恢复?

有时遇到一些特殊情况,需要我们对电脑磁盘进行格式化。但是硬盘无法格式化,这时我们应该怎么进行操作?你可以根据下面的操作,通过磁盘的创建权限,或者通过磁盘管理来进行格式化,一起来看看下面的简单操作&a…

威固的MOM,你的WOW 「 WOW 手武之道」威固巅峰技术交流赛圆满收官

近日,由全球特种材料公司伊士曼旗下汽车膜品牌威固(V-KOOL)举办的2022威固WOW手武之道技术交流会&PK赛,顺利收官。来自各地服务商的多位技师光芒尽显,展示贴装艺术,分别赢得广州站、南京站、郑州站及成…

WEB应用安全测试丨Acunetix功能简介

快速查找并修复使您的Web应用程序面临攻击风险的漏洞。享受更多的安心——无需花费更多有限的时间。 产品功能 发现与爬行 01、发现所有需要扫描的东西 Acunetix会自动创建所有网站、应用程序和API的列表,并使其保持新状态。 这意味着您不会留下未扫描且容易受到…

00后少年的心力之作(已开源) | heartt(心力算法)

心力之作: 综合性极强的文本摘要算法: heartt(心力算法) 大家好,我是 heartt 算法的作者。我今年 13 岁,是一名热爱编程的学习者。 今天,我要向大家介绍我的新算法:heartt。 00后少年的心力之作(已开源) | …

xxx 拘留室项目

1.项目介绍 本项目用于当地拘留室,定位:监控、值班系统,项目时间:十二月。 系统涉及人员:值班人员、拘留人员 设备:摄像头(海康)、门禁(中控安防)、声光报警…

特色功能(锐捷云桌面篇)

大家好,我是小杜。转眼居家办公已经一周多了,有没有小伙伴和小杜一样,感觉还是在公司上班好,进入状态快呢。现在的主要精力是业务上,处理完对应业务后,就开始了“快乐”的学习了。还是相信之前纯粹的学习时…

常见的5种数据分析方法有哪些?

看大家介绍了那么那么多的数据分析方法,但不同的数据分析方法使用场景不同,A常用的B不一定常用。 所以这篇只介绍5种基于逻辑层面的,几乎人人都会用的数据分析方法。 先来分享一下数据分析6大步骤: 按照这6个步骤,结合…

uni-app的条件编译

条件编译了解 前言: 由于本次业务有 PC 端H5 页面,还有 手机端的H5页面,不同的端,模块展示可能不同,但是大部分功能又是相同的。 如果通过简单的 if…else… 判断不同端,调用相应的 API 或 展示相应的模块…

设计模式——设计思想

设计模式——设计思想一、面向对象的四大特性:1、封装2、抽象3、继承4、多态二、抽象类和接口类1、抽象类和接口的语法特性2、抽象类和接口存在的意义3、抽象类和接口的应用场景4、抽象类和接口的区别三、面向对象编程与面向过程编程1、面向对象编程和面向对象编程语…

mac中nvm管理node

目录检查电脑上是否存在node卸载node安装nvm报错查看本机的ip地址修改host文件重新安装nvm - 报错重新安装nvm - 报错安装完成兼容性运行之前的项目 -> 报错运行之前的项目 -> 报错常用命令nvm安装之前若是电脑上存在node,要先将node卸载掉检查电脑上是否存在…

catia建模圆柱直齿轮和斜齿

1 圆弧近似方案 参考 7.1 直齿轮(简单)1_哔哩哔哩_bilibili 2 渐开线生成点--》生成样条曲线方案 参考 7.2渐开线齿廓直齿圆柱齿轮(1)_哔哩哔哩_bilibili xd基圆半径rb *sin(t*PI*1rad)-基圆半径rb *t*PI*cos(t*PI*1rad) yd基…

如何做好性能压测(一):压测环境的设计和搭建

本文是阿里巴巴 PTS 团队《Performance Test Together》系列专题分享,霍格沃兹测试学院经特别授权转载,也会结合学员实际需求组织大咖公开课主题分享,文末有福利! 性能压测,是保障服务可用性和稳定性过程中&#xff0c…

MySQL校招集锦

数据库面试集锦 1.请说下你对MySQL架构的了解 先看一下MySQL的架构图 大体来说,MySQL 可以分为 Server 层和存储引擎两部分。 Server 层包括:连接器、查询缓存、分析器、优化器、执行器等,涵盖了 MySQL 的大多数核心服务功能,…

2.hadoop系列之组成简介

本文我们了解hadoop3的组成部分,如下图所示,包括HDFS数据存储、Yarn资源调度、MapReduce计算 1. HDFS概述 HDFS: Hadoop Distributed File System,是一个分布式文件系统 HDFS由NameNode、DataNode、Secondary NameNode组成 NameNode:存储文…