This commit is contained in:
douboer
2025-09-07 02:13:30 +08:00
parent c463e3b785
commit 1ba01e3c64
8 changed files with 1213 additions and 135 deletions

View File

@@ -142,11 +142,32 @@ class BubbleMetricsWidget(QWidget):
content_rect = QRectF(rect.left()+margin, rect.top()+title_height+margin, rect.width()-2*margin, rect.height()-title_height-2*margin)
if not self.metrics:
p.drawText(rect, Qt.AlignmentFlag.AlignCenter, '暂无数据'); p.end(); return
# 归一化
minute_values = [(v*60 if u=='h' else v) for (lbl,v,u,c) in self.metrics]
# 归一化:统一把不同单位数值映射到“分钟等价”尺度,以便半径比较
# 规则:小时(h) -> v*60分钟(m) -> v书本数量(book) -> v*60 (一书折算 1 小时,避免过小)
minute_values = []
for (lbl, v, u, c) in self.metrics:
if u == 'h':
minute_values.append(v * 60)
elif u == 'm':
minute_values.append(v)
elif u == 'book': # 新增:书籍数量指标
minute_values.append(v * 60) # 折算1 本 ≈ 60 分钟,使气泡视觉权重合理
else: # 未知单位直接使用原值
minute_values.append(v)
max_minutes = max(minute_values) if minute_values else 1
radii_norm = [0.3 + 0.7 * math.sqrt((mv/max_minutes) if max_minutes>0 else 0) for mv in minute_values]
default_pos = { '全年':(0.20,0.50), '月均':(0.50,0.18), '近7天':(0.80,0.50), '日均':(0.50,0.82) }
# 默认布局4 指标与 5 指标(包含“已读”)使用不同的预设坐标,尽量避免重叠
labels = [m[0] for m in self.metrics]
if '已读' in labels and len(labels) >= 5:
default_pos = {
'全年': (0.18, 0.55),
'月均': (0.38, 0.20),
'近7天': (0.82, 0.55),
'日均': (0.38, 0.85),
'已读': (0.60, 0.55)
}
else:
default_pos = { '全年':(0.20,0.50), '月均':(0.50,0.18), '近7天':(0.80,0.50), '日均':(0.50,0.82), '已读':(0.50,0.50) }
if any(lbl not in default_pos for (lbl,*_) in self.metrics):
step = 1.0/(len(self.metrics)+1)
default_pos = {m[0]:(step*(i+1),0.5) for i,m in enumerate(self.metrics)}
@@ -170,8 +191,15 @@ class BubbleMetricsWidget(QWidget):
p.setPen(QPen(QColor('#ffffff'),2)); p.setBrush(QColor(color)); p.drawEllipse(circle_rect)
p.setPen(QColor('#ffffff'))
f = p.font(); f.setBold(True); f.setPointSize(max(9,int(R/5))); p.setFont(f)
txt = f"{val:.0f} 小时" if unit=='h' and val>=10 else (f"{val:.1f} 小时" if unit=='h' else f"{val:.0f} 分钟")
p.drawText(circle_rect, Qt.AlignmentFlag.AlignCenter, f"{txt}\n{label}")
if unit == 'h':
txt_core = f"{val:.0f} 小时" if val >= 10 else f"{val:.1f} 小时"
elif unit == 'm':
txt_core = f"{val:.0f} 分钟"
elif unit == 'book':
txt_core = f"{val:.0f} 本书"
else:
txt_core = f"{val:.0f}"
p.drawText(circle_rect, Qt.AlignmentFlag.AlignCenter, f"{txt_core}\n{label}")
# 标题(为空保留对齐占位)
p.setPen(QColor('#222222'))
f = p.font(); f.setBold(True); f.setPointSize(10); p.setFont(f)