163 lines
7.4 KiB
Python
163 lines
7.4 KiB
Python
|
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 # 返回绘图组件和绘图项对象
|