# 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