239 lines
11 KiB
Python
239 lines
11 KiB
Python
# coding: gb2312
|
|
from PyQt5.QtGui import QColor
|
|
from PyQt5.QtWidgets import *
|
|
from LSZXPagesManagerLibrary.consensus import *
|
|
from PyQt5.QtCore import *
|
|
|
|
|
|
class GradeSummary(QWidget):
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.animation = None
|
|
self.scroll_timer = None
|
|
self.data_list = []
|
|
self.header_type_table = HEADER_TYPE_TABLE
|
|
self.column_names = ['编号', '姓名', '心率', '血氧', '仰卧起坐', '引体向上', '30*2蛇形跑', '长跑', '俯卧撑']
|
|
|
|
self.item_widget = self._init_item_widget()
|
|
self.item_title = self._init_item_title()
|
|
# 表格
|
|
self.table_widget = self._init_table_widget()
|
|
|
|
self.main_layout = QVBoxLayout()
|
|
self.main_layout.setContentsMargins(10, 0, 10, 0)
|
|
self.main_layout.addWidget(self.item_title, 6)
|
|
self.main_layout.addWidget(self.table_widget, 94)
|
|
self.item_widget.setLayout(self.main_layout)
|
|
|
|
self.layout = QHBoxLayout()
|
|
self.layout.setContentsMargins(0, 0, 0, 0)
|
|
self.layout.addWidget(self.item_widget)
|
|
self.setLayout(self.layout)
|
|
|
|
def set_data(self, data):
|
|
self.data_list = data
|
|
self.draw_table()
|
|
|
|
def draw_table(self):
|
|
self.table_widget.setColumnCount(len(self.column_names))
|
|
self.table_widget.setHorizontalHeaderLabels(self.column_names)
|
|
self.table_widget.setRowCount(len(self.data_list))
|
|
for row_index, row_data in enumerate(self.data_list):
|
|
for col_index, col_name in enumerate(self.column_names):
|
|
if col_name == self.header_type_table[HR]:
|
|
value = str(row_data['hr']['hr'])
|
|
item = QTableWidgetItem(value)
|
|
item.setTextAlignment(Qt.AlignCenter) # 设置文字居中
|
|
if row_data['hr']['color'] == 'R':
|
|
item.setBackground(QColor("#FF0000")) # 将心率列背景设置为红色
|
|
item.setForeground(QColor("#000000"))
|
|
elif row_data['hr']['color'] == 'G':
|
|
item.setBackground(QColor("#74f035"))
|
|
item.setForeground(QColor("#000000"))
|
|
elif row_data['hr']['color'] == 'Y':
|
|
item.setBackground(QColor("#ffff00"))
|
|
item.setForeground(QColor("#000000"))
|
|
self.table_widget.setItem(row_index, col_index, item)
|
|
elif col_name == self.header_type_table[BO]:
|
|
value = str(row_data['bo']['bo'])
|
|
item = QTableWidgetItem(value)
|
|
item.setTextAlignment(Qt.AlignCenter) # 设置文字居中
|
|
if row_data['bo']['color'] == 'R':
|
|
item.setBackground(QColor("#FF0000")) # 将心率列背景设置为红色
|
|
item.setForeground(QColor("#000000"))
|
|
elif row_data['bo']['color'] == 'G':
|
|
item.setBackground(QColor("#74f035"))
|
|
item.setForeground(QColor("#000000"))
|
|
elif row_data['bo']['color'] == 'Y':
|
|
item.setBackground(QColor("#ffff00"))
|
|
item.setForeground(QColor("#000000"))
|
|
self.table_widget.setItem(row_index, col_index, item)
|
|
elif col_name == self.header_type_table[SIT_UP]:
|
|
situp_data = row_data['situp']
|
|
if situp_data['count'] is not None:
|
|
value = str(situp_data['count'])
|
|
else:
|
|
value = ""
|
|
item = QTableWidgetItem(value)
|
|
item.setTextAlignment(Qt.AlignCenter) # 设置文字居中
|
|
if row_data['situp']['is_changed']:
|
|
item.setBackground(QColor("#74f035")) # 将心率列背景设置为红色
|
|
item.setForeground(QColor("#000000"))
|
|
self.table_widget.setItem(row_index, col_index, item)
|
|
elif col_name == self.header_type_table[PULL_UP]:
|
|
situp_data = row_data['pullup']
|
|
if situp_data['count'] is not None:
|
|
value = str(situp_data['count'])
|
|
else:
|
|
value = ""
|
|
item = QTableWidgetItem(value)
|
|
item.setTextAlignment(Qt.AlignCenter) # 设置文字居中
|
|
if row_data['pullup']['is_changed']:
|
|
item.setBackground(QColor("#74f035")) # 将心率列背景设置为红色
|
|
item.setForeground(QColor("#000000"))
|
|
self.table_widget.setItem(row_index, col_index, item)
|
|
elif col_name == self.header_type_table[RUNAROUND]:
|
|
situp_data = row_data['runaround']
|
|
if situp_data['count'] is not None:
|
|
value = str(situp_data['count'])
|
|
else:
|
|
value = ""
|
|
item = QTableWidgetItem(value)
|
|
item.setTextAlignment(Qt.AlignCenter) # 设置文字居中
|
|
if row_data['runaround']['is_changed']:
|
|
item.setBackground(QColor("#74f035")) # 将心率列背景设置为红色
|
|
item.setForeground(QColor("#000000"))
|
|
self.table_widget.setItem(row_index, col_index, item)
|
|
elif col_name == self.header_type_table[RUNNING]:
|
|
situp_data = row_data['running']
|
|
if situp_data['count'] is not None:
|
|
value = str(situp_data['count'])
|
|
else:
|
|
value = ""
|
|
item = QTableWidgetItem(value)
|
|
item.setTextAlignment(Qt.AlignCenter) # 设置文字居中
|
|
if row_data['running']['is_changed']:
|
|
item.setBackground(QColor("#74f035")) # 将心率列背景设置为红色
|
|
item.setForeground(QColor("#000000"))
|
|
self.table_widget.setItem(row_index, col_index, item)
|
|
elif col_name == self.header_type_table[PUSH_UP]:
|
|
situp_data = row_data['pushup']
|
|
if situp_data['count'] is not None:
|
|
value = str(situp_data['count'])
|
|
else:
|
|
value = ""
|
|
item = QTableWidgetItem(value)
|
|
item.setTextAlignment(Qt.AlignCenter) # 设置文字居中
|
|
if row_data['pushup']['is_changed']:
|
|
item.setBackground(QColor("#74f035")) # 将心率列背景设置为红色
|
|
item.setForeground(QColor("#000000"))
|
|
self.table_widget.setItem(row_index, col_index, item)
|
|
else:
|
|
if col_name == self.header_type_table[NAME]:
|
|
value = row_data['name']
|
|
elif col_name == self.header_type_table[ID]:
|
|
value = str(row_data['id'])
|
|
else:
|
|
value = ""
|
|
item = QTableWidgetItem(value)
|
|
item.setTextAlignment(Qt.AlignCenter) # 设置文字居中
|
|
self.table_widget.setItem(row_index, col_index, item)
|
|
|
|
# 设置表头样式
|
|
header = self.table_widget.horizontalHeader()
|
|
header.setStyleSheet("""
|
|
QHeaderView::section {
|
|
background-color: none;
|
|
font: 600 15px \"Microsoft YaHei UI\";
|
|
background: transparent;
|
|
border: 1px solid #0e5af4;
|
|
color: #08a4ff;
|
|
border-image: none;
|
|
padding-top: 3px;
|
|
padding-bottom: 3px;
|
|
border-left: none;
|
|
border-right: none;
|
|
}
|
|
""")
|
|
|
|
# 不显示行号
|
|
self.table_widget.verticalHeader().setVisible(False)
|
|
# 使表格宽度撑满屏幕
|
|
self.table_widget.horizontalHeader().setStretchLastSection(True)
|
|
self.table_widget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
|
|
|
|
self.table_widget.horizontalHeader().setSectionResizeMode(len(self.column_names) - 1, QHeaderView.Fixed)
|
|
self.table_widget.setColumnWidth(len(self.column_names) - 1, 50)
|
|
# 使表格行高和列宽自适应
|
|
self.table_widget.verticalHeader().setDefaultSectionSize(30)
|
|
# 双击时不能对表格内容进行修改
|
|
self.table_widget.setEditTriggers(QAbstractItemView.NoEditTriggers)
|
|
# 设置表格数据溢出时不显示滚动条
|
|
self.table_widget.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
|
|
self.table_widget.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
|
|
|
|
# 自动滚动定时器
|
|
self.scroll_timer = QTimer(self)
|
|
self.scroll_timer.timeout.connect(self.auto_scroll)
|
|
self.scroll_timer.start(2000) # 每 2 秒滚动一次
|
|
|
|
# 动画相关
|
|
self.animation = QPropertyAnimation(self.table_widget.verticalScrollBar(), b"value")
|
|
self.animation.setDuration(1000) # 动画持续时间,可根据需要调整
|
|
|
|
# 鼠标跟踪
|
|
self.setMouseTracking(True)
|
|
|
|
def auto_scroll(self):
|
|
current_value = self.table_widget.verticalScrollBar().value()
|
|
if current_value == self.table_widget.verticalScrollBar().maximum():
|
|
self.animation.setEndValue(0) # 滚动到顶部
|
|
self.animation.start()
|
|
else:
|
|
new_value = current_value + 1
|
|
if new_value > self.table_widget.verticalScrollBar().maximum():
|
|
new_value = self.table_widget.verticalScrollBar().maximum() # 保持在底部
|
|
self.animation.setEndValue(new_value)
|
|
self.animation.start()
|
|
|
|
@staticmethod
|
|
def _init_table_widget():
|
|
table_widget = QTableWidget()
|
|
table_widget.setStyleSheet(
|
|
"background: transparent;"
|
|
"border: none;"
|
|
"border-image: none;"
|
|
"background-image: none;"
|
|
"color: #ffffff;"
|
|
"font: 15px \"Microsoft YaHei UI\";"
|
|
)
|
|
return table_widget
|
|
|
|
@staticmethod
|
|
def _init_item_title():
|
|
item_title = QLabel("成绩汇总")
|
|
item_title.setAlignment(Qt.AlignCenter | Qt.AlignVCenter)
|
|
item_title.setStyleSheet(
|
|
"font: 600 24px \"Microsoft YaHei UI\";"
|
|
"color: #2c1654;"
|
|
"border: none;"
|
|
"border-image: none;"
|
|
"background-color: #fac14e;"
|
|
"margin: 6px 250px 6px 250px;"
|
|
"padding-top: 4px;"
|
|
"padding-bottom: 4px;"
|
|
"letter-spacing: 4px;"
|
|
)
|
|
return item_title
|
|
|
|
@staticmethod
|
|
def _init_item_widget():
|
|
item_widget = QWidget()
|
|
item_widget.setStyleSheet(
|
|
"background-color: none;"
|
|
"border: 2px solid #FFFF00;"
|
|
"border-radius: 4px;"
|
|
"background: none;"
|
|
)
|
|
return item_widget
|