提交新建内容
This commit is contained in:
113
StatusStyleDelegate.py
Normal file
113
StatusStyleDelegate.py
Normal file
@@ -0,0 +1,113 @@
|
||||
# StatusStyleDelegate.py
|
||||
from PySide6.QtWidgets import QStyledItemDelegate
|
||||
from PySide6.QtGui import QColor, QFont, QBrush
|
||||
from PySide6.QtCore import Qt, QTimer
|
||||
from PySide6.QtGui import QPalette
|
||||
|
||||
class StatusStyleDelegate(QStyledItemDelegate):
|
||||
def __init__(self, parent=None, table_view=None):
|
||||
super().__init__(parent)
|
||||
self.flash_cycles = {} # 存储闪烁周期: {(row, col): (timer, cycle_count, original_brush)}
|
||||
# self.flash_duration = 1000 # 闪烁持续时间(毫秒)
|
||||
# self.updated_cells = set() # 存储需要高亮的单元格 (row, col)
|
||||
self.table_view = table_view # 保存 QTableView 实例
|
||||
|
||||
def flash_cell(self, row, column):
|
||||
# 如果单元格已经在闪烁,重置计时器
|
||||
if (row, column) in self.flash_cycles:
|
||||
timer, _, _ = self.flash_cycles[(row, column)]
|
||||
timer.stop()
|
||||
del self.flash_cycles[(row, column)]
|
||||
|
||||
# 获取原始背景色
|
||||
index = self.table_view.model().index(row, column)
|
||||
original_brush = self.get_original_background(index)
|
||||
|
||||
# 创建周期性计时器实现闪烁效果
|
||||
cycle_count = 0
|
||||
timer = QTimer()
|
||||
timer.setInterval(200) # 200ms切换一次颜色
|
||||
|
||||
def update_flash():
|
||||
nonlocal cycle_count
|
||||
cycle_count += 1
|
||||
# 闪烁3个周期(6次切换)后停止
|
||||
if cycle_count > 6:
|
||||
timer.stop()
|
||||
if (row, column) in self.flash_cycles:
|
||||
del self.flash_cycles[(row, column)]
|
||||
self.table_view.viewport().update()
|
||||
return
|
||||
|
||||
# 切换背景色 (黄色 <-> 原始色)
|
||||
is_highlight = (cycle_count % 2 == 1)
|
||||
self.flash_cycles[(row, column)] = (timer, cycle_count, original_brush)
|
||||
self.table_view.viewport().update()
|
||||
|
||||
timer.timeout.connect(update_flash)
|
||||
self.flash_cycles[(row, column)] = (timer, cycle_count, original_brush)
|
||||
timer.start()
|
||||
update_flash() # 立即开始第一个周期
|
||||
|
||||
|
||||
def get_original_background(self, index):
|
||||
# 获取单元格原始背景色
|
||||
model = index.model()
|
||||
status_index = model.index(index.row(), 7)
|
||||
status = model.data(status_index, Qt.ItemDataRole.DisplayRole)
|
||||
|
||||
if status == "已触发":
|
||||
return QBrush(QColor('lightcoral'))
|
||||
elif status == "错买":
|
||||
return QBrush(QColor('lightgreen'))
|
||||
else:
|
||||
return QBrush(QColor('white'))
|
||||
|
||||
def initStyleOption(self, option, index):
|
||||
super().initStyleOption(option, index)
|
||||
|
||||
model = index.model()
|
||||
status_index = model.index(index.row(), 7)
|
||||
status = model.data(status_index, Qt.ItemDataRole.DisplayRole)
|
||||
|
||||
|
||||
if status == "已触发":
|
||||
option.font = QFont("Arial", 14, QFont.Weight.Bold)
|
||||
option.palette.setColor(QPalette.ColorRole.Text, QColor('red'))
|
||||
option.backgroundBrush = QBrush(QColor('lightcoral')) # 背景色
|
||||
elif status == "错买":
|
||||
option.font = QFont("Arial", 14, QFont.Weight.Bold)
|
||||
option.palette.setColor(QPalette.ColorRole.Text, QColor('green')) # 文字颜色
|
||||
option.backgroundBrush = QBrush(QColor('lightgreen')) # 背景色
|
||||
elif status == "监控中":
|
||||
option.font = QFont("Arial", 12, QFont.Weight.Normal)
|
||||
option.palette.setColor(QPalette.ColorRole.Text, QColor('black'))
|
||||
option.backgroundBrush = QBrush(QColor('white'))
|
||||
else:
|
||||
option.font = QFont("Arial", 12, QFont.Weight.Normal)
|
||||
option.palette.setColor(QPalette.ColorRole.Text, QColor('black'))
|
||||
option.backgroundBrush = QBrush(QColor('white'))
|
||||
|
||||
# 应用闪烁效果 (黄色 <-> 原始色交替)
|
||||
row = index.row()
|
||||
col = index.column()
|
||||
if (row, col) in self.flash_cycles:
|
||||
timer, cycle_count, original_brush = self.flash_cycles[(row, col)]
|
||||
if cycle_count % 2 == 1:
|
||||
# 使用高对比度黄色 (#FFFF99)
|
||||
option.backgroundBrush = QBrush(QColor(255, 255, 153))
|
||||
else:
|
||||
option.backgroundBrush = original_brush
|
||||
|
||||
# 新增对获利列的处理
|
||||
if index.column() == 6: # 检查是否为获利列
|
||||
option.font = QFont(option.font().family(), option.font().pointSize(), QFont.Weight.Bold)
|
||||
profit_text = model.data(index, Qt.ItemDataRole.DisplayRole)
|
||||
try:
|
||||
profit_value = float(profit_text.replace('%', '')) # 移除百分号再转换
|
||||
if profit_value > 0:
|
||||
option.palette.setColor(QPalette.ColorRole.Text, QColor('red'))
|
||||
elif profit_value < 0:
|
||||
option.palette.setColor(QPalette.ColorRole.Text, QColor('green'))
|
||||
except ValueError:
|
||||
pass # 如果转换失败,保持默认颜色
|
||||
Reference in New Issue
Block a user