pyqt5用QPainter在扇形上面描绘数据点,并可点击提示

2024-08-21 18:28

本文主要是介绍pyqt5用QPainter在扇形上面描绘数据点,并可点击提示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  1. 绘画底层图形
  2. 在图形内描绘数据点
  3. 点击数据点时悬浮提示内容

数据有距离和角度,来绘画数据点,实时检测数据插入,可以用多进程,通过共用队列来传递数据
在这里插入图片描述

需要自动更新绘图时,调用self.update(),此代码仅保留思路

class Alarm_widget(QWidget):message_signal = pyqtSignal(object)  # 自定义信号,发送给子窗口的消息def __init__(self):super().__init__()self.initUI()def initUI(self):self.init_width = 1100self.init_high = 800# self.setGeometry(100, 100, self.init_width, self.init_high)self.setWindowTitle('PyQt5 扇形和点绘制')# 创建一个定时器,用于在达到一定时间后关闭tooltipself.toolTip_time = QTimer(self)self.toolTip_time.timeout.connect(self.hide_tool_tip)self.time_hide_tip = 10000  # 设置Tip多长时间的显示,毫秒#插入测试数据self.data_points['data1'] = {'distance': 5000, 'angle': 12, 'color': QColor(255, 165, 0)}def paintEvent(self, event):qp = QPainter(self)qp.setRenderHint(QPainter.Antialiasing, True)  # 使用抗锯齿qp.begin(self)self.draw_pie_and_points(qp, self.data_points)qp.end()def draw_pie_and_points(self, qp, data_points:dict):"""画扇形和打点:param qp: QPainter:param data_points: 数据点位字典:return:"""pie_num = 4  # 扇形的数量widget_size = (int(self.width() / 2), int(self.height() / 2))  # 图形占窗口的比例self.center = QPointF(widget_size[0], widget_size[1] + 20)   # 圆心位置self.start_angle = 45 * 16 # 开始角度是从3点钟方向逆时针开始, 转换为16进制表示的角度self.span_angle = 90 * 16  # 结束角度if self.center.x() < self.center.y():  # 取尺寸最小的,防止超出屏幕radius_step = int(widget_size[0] / pie_num)  # 每多少像素代表10kmelse:radius_step = int(widget_size[1] / pie_num)self.point_radius = 5  # 告警点的半径大小for i in range(0, 4):radius = (4-i) * radius_step# 绘制扇形qp.setBrush(QBrush(QColor(213, 226, 247)))# qp.setPen(QPen(Qt.black, 1, Qt.DashLine)) # 线宽1,线型为虚线qp.drawPie(self.center.x() - radius, self.center.y() - radius, 2 * radius, 2 * radius, self.start_angle, self.span_angle)# 中线radius = 4 * radius_stepqp.setPen(QPen(Qt.black, 1, Qt.DashLine)) # 黑色,像素宽,虚线样式qp.drawLine(self.center.x(), self.center.y(), self.center.x(), (self.center.y() - radius))num = 0  # 计数多少数据# 绘制短线和旁边的名称line_height = 40  # 每行数据之间的垂直间隔text_offset = 20  # 文本与线条之间的水平间隔font = QFont()font.setPointSize(12)  # 设置字体大小为12点# 角度转弧度,计算数据详情列表的左侧位置angle_rad = math.radians(180-(self.start_angle+self.span_angle)/16)# 计算余弦值cos_value = math.cos(angle_rad) * 4 * radius_stepresult_list_posx = self.center.x() - cos_valuefor data, meta in data_points.items():distance = meta['distance']color_value = meta['color']# 设置点的颜色和大小qp.setPen(QPen(color_value, 8))# 距离 转换 像素距离pix_distance = distance * radius_step / 10000if 'angle' in meta:  # 存在角度值,则画点angle = meta['angle']# 将极坐标转换为直角坐标x = self.center.x() + pix_distance * math.cos(math.radians(90 - angle))y = self.center.y() - pix_distance * math.sin(math.radians(90 - angle))self.points[data] = (x, y)# 绘制点(使用 drawEllipse 方法绘制很小的圆来近似点)qp.drawEllipse(QPointF(x, y), self.point_radius - 1, self.point_radius - 1)# 在下面列表展示详情qp.setFont(font)qp.setBrush(color_value)  # 设置填充颜色qp.drawEllipse(result_list_posx + 3, self.center.y() + 20 + line_height * num, 14, 14)  # 绘制圆点qp.setPen(Qt.black)  # 设置文本颜色为黑色text = "提示内容1"qp.drawText(result_list_posx + 20 + text_offset, self.center.y() + 33 + line_height * num, text)num += 1def mousePressEvent(self, event):# 检测鼠标是否在点的附近pos = event.pos()check_radius = self.point_radius + 2  # 检测鼠标点击半径,比告警点宽一点点# self.lastClickedPoint = Nonefor data, position in self.points.items():x = position[0]y = position[1]# 检查鼠标是否在点的矩形区域内(使用半径扩展)rect = QRect(x - check_radius, y - check_radius, 2 * check_radius, 2 * check_radius)if rect.contains(pos):# self.lastClickedPoint = QPoint(x, y)tip = data[-4:] + ': ' + self.data_points[data]['collect_time'][5:-3]# 显示提示,并设置定时器self.show_tool_tip(pos, tip)self.toolTip_time.start(self.time_hide_tip)  # 到时隐藏提示breakelse:for imsi, r in self.arcs_radius.items():if self.is_point_on_arc(r, self.start_angle, self.span_angle, pos, self.point_radius):# print("点击点在圆弧上")tip = imsi[-4:] + ': ' + self.data_points[imsi]['collect_time'][5:-3]# 显示提示,并设置定时器self.show_tool_tip(pos, tip)self.toolTip_time.start(self.time_hide_tip)  # 到时隐藏提示breakelse:# 如果没有在任何点附近,隐藏工具提示self.hide_tool_tip()def resizeEvent(self, event):# 当窗口大小改变时,触发重绘self.update()def show_tool_tip(self, pos, text:str):"""在指定坐标显示提示:param pos: 信息提示的坐标:param text: 提示内容:return:"""self.toolTipLabel.setText(f"{text}")# 将label移动到鼠标位置附近,但可能需要根据需要进行调整以避免遮挡label_pos = pos + QPoint(20, -self.toolTipLabel.height() - 20)# 显示CustomToolTip在widget的指定位置附近screen = QApplication.desktop().screenGeometry()# widget_rect = self.geometry()# widget_top_left = self.mapToGlobal(widget_rect.topLeft())# # 计算位置,确保ToolTip不会超出屏幕# x = widget_top_left.x() + pos.x()# y = widget_top_left.y() + pos.y()x = label_pos.x()y = label_pos.y()if x + self.toolTipLabel.width() > screen.width():x = screen.width() - self.toolTipLabel.width()if y + self.toolTipLabel.height() > screen.height():y = screen.height() - self.toolTipLabel.height()self.toolTipLabel.move(x, y)self.toolTipLabel.show()def hide_tool_tip(self):self.toolTipLabel.hide()self.toolTip_time.stop()

这篇关于pyqt5用QPainter在扇形上面描绘数据点,并可点击提示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1093932

相关文章

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Redis 中的热点键和数据倾斜示例详解

《Redis中的热点键和数据倾斜示例详解》热点键是指在Redis中被频繁访问的特定键,这些键由于其高访问频率,可能导致Redis服务器的性能问题,尤其是在高并发场景下,本文给大家介绍Redis中的热... 目录Redis 中的热点键和数据倾斜热点键(Hot Key)定义特点应对策略示例数据倾斜(Data S

Python实现将MySQL中所有表的数据都导出为CSV文件并压缩

《Python实现将MySQL中所有表的数据都导出为CSV文件并压缩》这篇文章主要为大家详细介绍了如何使用Python将MySQL数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到... python将mysql数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到另一个

mss32.dll文件丢失怎么办? 电脑提示mss32.dll丢失的多种修复方法

《mss32.dll文件丢失怎么办?电脑提示mss32.dll丢失的多种修复方法》最近,很多电脑用户可能遇到了mss32.dll文件丢失的问题,导致一些应用程序无法正常启动,那么,如何修复这个问题呢... 在电脑常年累月的使用过程中,偶尔会遇到一些问题令人头疼。像是某个程序尝试运行时,系统突然弹出一个错误提

电脑提示找不到openal32.dll文件怎么办? openal32.dll丢失完美修复方法

《电脑提示找不到openal32.dll文件怎么办?openal32.dll丢失完美修复方法》openal32.dll是一种重要的系统文件,当它丢失时,会给我们的电脑带来很大的困扰,很多人都曾经遇到... 在使用电脑过程中,我们常常会遇到一些.dll文件丢失的问题,而openal32.dll的丢失是其中比较

SpringBoot整合jasypt实现重要数据加密

《SpringBoot整合jasypt实现重要数据加密》Jasypt是一个专注于简化Java加密操作的开源工具,:本文主要介绍详细介绍了如何使用jasypt实现重要数据加密,感兴趣的小伙伴可... 目录jasypt简介 jasypt的优点SpringBoot使用jasypt创建mapper接口配置文件加密