LISHUZUOXUN_yangjiang/LSZXPagesLibrary/bo_plot_graph_opengl.py

163 lines
7.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import sys
from PyQt5.QtCore import Qt # 从 PyQt5.QtCore 模块导入 Qt
from PyQt5.QtWidgets import QFrame, QLabel, QHBoxLayout, QVBoxLayout, QApplication, QOpenGLWidget # 从 PyQt5.QtWidgets 模块导入所需组件
from OpenGL.GL import * # 从 OpenGL.GL 模块导入所有内容
from OpenGL.GLU import * # 从 OpenGL.GLU 模块导入所有内容
import pyqtgraph as pg # 导入 pyqtgraph 并命名为 pg
class BoPlotGraph(QOpenGLWidget): # 继承自 QOpenGLWidget表示这是一个使用 OpenGL 渲染的窗口组件
def __init__(self): # 初始化方法
super().__init__() # 调用父类的初始化方法
self.setWindowTitle("血氧监测") # 设置窗口标题
# 初始化各个组件
self.icon_widget = self._init_icon_widget() # 初始化图标组件
self.title_widget = self._init_title_widget() # 初始化标题组件
self.value_label = self._init_value_label() # 初始化当前血氧显示组件
self.min_label = self._init_min_label() # 初始化最小血氧显示组件
self.plot_widget_bo, self.plot_item_bo = self._init_plot_widget() # 初始化绘图组件
# 设置标题布局
self.title_layout = QHBoxLayout() # 创建水平布局
self.title_layout.addWidget(self.icon_widget, 1) # 占据 10% 的屏幕宽度
self.title_layout.addWidget(self.title_widget, 9) # 占据 90% 的屏幕宽度
# 设置血氧值布局
self.values_title_layout = QVBoxLayout() # 创建垂直布局
self.values_title_layout.addWidget(self.value_label, 1) # 占据 50% 的垂直空间
self.values_title_layout.addWidget(self.min_label, 1) # 占据 50% 的垂直空间
# 设置显示布局
self.display_layout = QHBoxLayout() # 创建水平布局
self.display_layout.addLayout(self.values_title_layout, 1) # 占据 40% 的水平空间
self.display_layout.addWidget(self.plot_widget_bo, 3) # 占据 60% 的水平空间
# 主布局
self.main_layout = QVBoxLayout() # 创建垂直布局
self.main_layout.addLayout(self.title_layout, 1) # 占据 20% 的垂直空间
self.main_layout.addLayout(self.display_layout, 4) # 占据 80% 的垂直空间
self.setLayout(self.main_layout) # 设置主布局
self.setStyleSheet(
"background-color: #ffffff;"
"border: 1px solid #bbbbbb;"
"border-radius: 4px;"
"margin-right: 20px;"
"margin-top: 0px"
) # 设置样式
def initializeGL(self): # 初始化 OpenGL
glClearColor(1.0, 1.0, 1.0, 1.0) # 设置清除颜色为白色
def resizeGL(self, w, h): # 调整 OpenGL 视口大小
glViewport(0, 0, w, h) # 设置 OpenGL 视口大小
glMatrixMode(GL_PROJECTION) # 设置当前矩阵为投影矩阵
glLoadIdentity() # 重置当前矩阵为单位矩阵
gluOrtho2D(0, w, h, 0) # 设置正交投影,匹配窗口宽度和高度
glMatrixMode(GL_MODELVIEW) # 设置当前矩阵为模型视图矩阵
glLoadIdentity() # 重置当前矩阵为单位矩阵
def paintGL(self): # 渲染 OpenGL 场景
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # 清除颜色缓冲区和深度缓冲区
def set_data(self, data, min_data): # 设置血氧数据和最小血氧值
"""
设置血氧数据和最小血氧值
:param data: 血氧数据列表
:param min_data: 最小血氧值
"""
self.plot_item_bo.setData(data) # 更新绘图数据
self.min_label.setText(f"最小血氧:{min_data}%") # 更新最小血氧显示
if data:
self.value_label.setText(f'当前血氧:{data[-1]}%') # 更新当前血氧显示
@staticmethod
def _init_icon_widget(): # 初始化图标组件
"""
初始化图标组件
:return: 图标 QLabel 对象
"""
img = QLabel() # 创建 QLabel 对象
img.setStyleSheet(
"border-image: url(assets/bloodO2.png);" # 设置图像路径
"background-size: contain;" # 设置背景大小
"background-repeat: no-repeat;" # 设置背景不重复
"background-position: center;" # 设置背景居中
)
img.setAlignment(Qt.AlignCenter) # 图标居中对齐
img.setScaledContents(True) # 图标大小自动缩放
return img
@staticmethod
def _init_title_widget(): # 初始化标题组件
"""
初始化标题组件
:return: 标题 QLabel 对象
"""
title = QLabel("血氧") # 创建 QLabel 对象
title.setStyleSheet(
"font: 30px \"Microsoft YaHei UI\";" # 设置字体和大小
"color: #2c2c2c;" # 设置字体颜色
"border: none;" # 无边框
)
title.setContentsMargins(20, 4, 20, 4) # 设置边距
return title
@staticmethod
def _init_value_label(): # 初始化当前血氧显示组件
"""
初始化当前血氧显示组件
:return: 当前血氧 QLabel 对象
"""
value_label = QLabel('当前血氧:%') # 创建 QLabel 对象
value_label.setFrameShape(QFrame.Box) # 设置框架形状
value_label.setLineWidth(0) # 设置线宽
value_label.setStyleSheet(
"border: none;" # 无边框
"background-color: #ececec;" # 设置背景颜色
"margin-right: 10px;" # 设置右边距
"margin: 0px 0px 0px 0px;" # 设置边距
"border-radius: 5px;" # 设置圆角半径
"font: 24px \"Microsoft YaHei UI\";" # 设置字体和大小
)
value_label.setAlignment(Qt.AlignCenter) # 文本居中对齐
return value_label
@staticmethod
def _init_min_label(): # 初始化最小血氧显示组件
"""
初始化最小血氧显示组件
:return: 最小血氧 QLabel 对象
"""
min_label = QLabel('最小血氧:%') # 创建 QLabel 对象
min_label.setFrameShape(QFrame.Box) # 设置框架形状
min_label.setLineWidth(0) # 设置线宽
min_label.setStyleSheet(
"border: none;" # 无边框
"background-color: #ececec;" # 设置背景颜色
"margin-right: 10px;" # 设置右边距
"margin: 0px 0px 0px 0px;" # 设置边距
"border-radius: 5px;" # 设置圆角半径
"font: 24px \"Microsoft YaHei UI\";" # 设置字体和大小
)
min_label.setAlignment(Qt.AlignCenter) # 文本居中对齐
return min_label
@staticmethod
def _init_plot_widget(): # 初始化绘图组件
"""
初始化绘图组件
:return: 绘图组件 PlotWidget 和绘图项 PlotDataItem 对象
"""
plot_widget_bo = pg.PlotWidget() # 创建 PlotWidget 对象
plot_item_bo = plot_widget_bo.plot() # 创建 PlotDataItem 对象
plot_widget_bo.getAxis('bottom').setTicks([]) # 不显示 x 轴坐标点
plot_widget_bo.setBackground('w') # 设置白色网格背景
plot_widget_bo.showGrid(x=True, y=True) # 显示网格
plot_widget_bo.setYRange(0, 100) # 设置 y 轴范围
pen = pg.mkPen(color='#5c7bd9', width=3) # 修改线条颜色和粗细
plot_item_bo.setPen(pen) # 设置绘图项的画笔样式
return plot_widget_bo, plot_item_bo # 返回绘图组件和绘图项对象