Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 60 additions & 8 deletions app/view/main/lottery.py
Comment thread
lzy98276 marked this conversation as resolved.
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ def initUI(self):
get_content_pushbutton_name_async("lottery", "reset_button")
)
self._set_widget_font(self.reset_button, 15)
self.reset_button.setFixedSize(165, 45)
self.reset_button.setFixedHeight(45)
self.reset_button.clicked.connect(lambda: self.reset_count())

self.minus_button = PushButton("-")
Expand Down Expand Up @@ -150,12 +150,12 @@ def initUI(self):
get_content_pushbutton_name_async("lottery", "start_button")
)
self._set_widget_font(self.start_button, 15)
self.start_button.setFixedSize(165, 45)
self.start_button.setFixedHeight(45)
self.start_button.clicked.connect(lambda: self.start_draw())

self.pool_list_combobox = ComboBox()
self._set_widget_font(self.pool_list_combobox, 12)
self.pool_list_combobox.setFixedSize(165, 45)
self.pool_list_combobox.setFixedHeight(45)
self.pool_list_combobox.setPlaceholderText(
get_content_name_async("lottery", "default_empty_item")
)
Expand All @@ -164,27 +164,27 @@ def initUI(self):

self.list_combobox = ComboBox()
self._set_widget_font(self.list_combobox, 12)
self.list_combobox.setFixedSize(165, 45)
self.list_combobox.setFixedHeight(45)
# 延迟填充班级列表,避免启动时进行文件IO
self.list_combobox.currentTextChanged.connect(self.on_class_changed)

self.range_combobox = ComboBox()
self._set_widget_font(self.range_combobox, 12)
self.range_combobox.setFixedSize(165, 45)
self.range_combobox.setFixedHeight(45)
# 延迟填充范围选项
self.range_combobox.currentTextChanged.connect(self.on_filter_changed)

self.gender_combobox = ComboBox()
self._set_widget_font(self.gender_combobox, 12)
self.gender_combobox.setFixedSize(165, 45)
self.gender_combobox.setFixedHeight(45)
# 延迟填充性别选项
self.gender_combobox.currentTextChanged.connect(self.on_filter_changed)

self.remaining_button = PushButton(
get_content_pushbutton_name_async("lottery", "remaining_button")
)
self._set_widget_font(self.remaining_button, 12)
self.remaining_button.setFixedSize(165, 45)
self.remaining_button.setFixedHeight(45)
self.remaining_button.clicked.connect(lambda: self.show_remaining_list())

# 初始时不进行昂贵的数据加载,改为延迟填充
Expand All @@ -197,7 +197,6 @@ def initUI(self):
self.many_count_label = BodyLabel(formatted_text)
self.many_count_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
self._set_widget_font(self.many_count_label, 10)
self.many_count_label.setFixedWidth(165)

self.control_widget = QWidget()
self.control_layout = QVBoxLayout(self.control_widget)
Expand Down Expand Up @@ -285,6 +284,9 @@ def initUI(self):
main_layout.addWidget(scroll, 1)
main_layout.addWidget(self.control_widget)

# 统一调整控件宽度以适应文本内容
self._adjustControlWidgetWidths()

# 在事件循环中延迟填充下拉框和初始统计,减少启动阻塞
QTimer.singleShot(0, self.populate_lists)

Expand All @@ -301,6 +303,53 @@ def add_control_widget_if_enabled(
# 出错时默认添加控件
layout.addWidget(widget, alignment=Qt.AlignmentFlag.AlignCenter)

def _adjustControlWidgetWidths(self):
"""统一调整控件宽度以适应文本内容"""
try:
# 收集所有需要调整宽度的控件
widgets_to_adjust = [
self.reset_button,
self.start_button,
self.pool_list_combobox,
self.list_combobox,
self.range_combobox,
self.gender_combobox,
self.remaining_button,
self.many_count_label,
]

# 计算所有控件文本所需的最大宽度
max_text_width = 0
for widget in widgets_to_adjust:
fm = widget.fontMetrics()
# 检查按钮/标签文本
if hasattr(widget, "text") and widget.text():
text_width = fm.horizontalAdvance(widget.text())
max_text_width = max(max_text_width, text_width)
# 检查占位符文本
if hasattr(widget, "placeholderText") and widget.placeholderText():
text_width = fm.horizontalAdvance(widget.placeholderText())
max_text_width = max(max_text_width, text_width)
# 检查下拉框所有选项的宽度
if hasattr(widget, "count"):
for i in range(widget.count()):
item_text = widget.itemText(i)
if item_text:
text_width = fm.horizontalAdvance(item_text)
max_text_width = max(max_text_width, text_width)

# 计算统一宽度(文本宽度 + 边距 + 下拉框箭头空间)
padding = 60 # 左右边距 + 下拉箭头空间
min_width = 165 # 最小宽度
unified_width = max(min_width, max_text_width + padding)

# 设置所有控件的固定宽度
for widget in widgets_to_adjust:
widget.setFixedWidth(int(unified_width))

except Exception as e:
logger.debug(f"调整控件宽度时出错: {e}")

def on_pool_changed(self):
"""当奖池选择改变时,更新奖数显示"""
try:
Expand Down Expand Up @@ -961,6 +1010,9 @@ def populate_lists(self):

LotteryUtils.update_start_button_state(self.start_button, total_count)

# 重新调整控件宽度以适应下拉框内容
self._adjustControlWidgetWidths()

except Exception as e:
logger.error(f"延迟填充列表失败: {e}")

Expand Down
65 changes: 58 additions & 7 deletions app/view/main/roll_call.py
Comment thread
lzy98276 marked this conversation as resolved.
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ def initUI(self):
get_content_pushbutton_name_async("roll_call", "reset_button")
)
self._set_widget_font(self.reset_button, 15)
self.reset_button.setFixedSize(165, 45)
self.reset_button.setFixedHeight(45)
self.reset_button.clicked.connect(lambda: self.reset_count())

self.minus_button = PushButton("-")
Expand Down Expand Up @@ -150,12 +150,12 @@ def initUI(self):
get_content_pushbutton_name_async("roll_call", "start_button")
)
self._set_widget_font(self.start_button, 15)
self.start_button.setFixedSize(165, 45)
self.start_button.setFixedHeight(45)
self.start_button.clicked.connect(lambda: self.start_draw())

self.list_combobox = ComboBox()
self._set_widget_font(self.list_combobox, 12)
self.list_combobox.setFixedSize(165, 45)
self.list_combobox.setFixedHeight(45)
self.list_combobox.setPlaceholderText(
get_content_name_async("roll_call", "default_empty_item")
)
Expand All @@ -164,21 +164,21 @@ def initUI(self):

self.range_combobox = ComboBox()
self._set_widget_font(self.range_combobox, 12)
self.range_combobox.setFixedSize(165, 45)
self.range_combobox.setFixedHeight(45)
# 延迟填充范围选项
self.range_combobox.currentTextChanged.connect(self.on_filter_changed)

self.gender_combobox = ComboBox()
self._set_widget_font(self.gender_combobox, 12)
self.gender_combobox.setFixedSize(165, 45)
self.gender_combobox.setFixedHeight(45)
# 延迟填充性别选项
self.gender_combobox.currentTextChanged.connect(self.on_filter_changed)

self.remaining_button = PushButton(
get_content_pushbutton_name_async("roll_call", "remaining_button")
)
self._set_widget_font(self.remaining_button, 12)
self.remaining_button.setFixedSize(165, 45)
self.remaining_button.setFixedHeight(45)
self.remaining_button.clicked.connect(lambda: self.show_remaining_list())

# 初始时不进行昂贵的数据加载,改为延迟填充
Expand All @@ -193,7 +193,6 @@ def initUI(self):
self.many_count_label = BodyLabel(formatted_text)
self.many_count_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
self._set_widget_font(self.many_count_label, 10)
self.many_count_label.setFixedWidth(165)

self.control_widget = QWidget()
self.control_layout = QVBoxLayout(self.control_widget)
Expand Down Expand Up @@ -271,6 +270,9 @@ def initUI(self):
main_layout.addWidget(scroll, 1)
main_layout.addWidget(self.control_widget)

# 统一调整控件宽度以适应文本内容
self._adjustControlWidgetWidths()

# 在事件循环中延迟填充下拉框和初始统计,减少启动阻塞
QTimer.singleShot(0, self.populate_lists)

Expand All @@ -287,6 +289,52 @@ def add_control_widget_if_enabled(
# 出错时默认添加控件
layout.addWidget(widget, alignment=Qt.AlignmentFlag.AlignCenter)

def _adjustControlWidgetWidths(self):
"""统一调整控件宽度以适应文本内容"""
try:
# 收集所有需要调整宽度的控件
widgets_to_adjust = [
self.reset_button,
self.start_button,
self.list_combobox,
self.range_combobox,
self.gender_combobox,
self.remaining_button,
self.many_count_label,
]

# 计算所有控件文本所需的最大宽度
max_text_width = 0
for widget in widgets_to_adjust:
fm = widget.fontMetrics()
# 检查按钮/标签文本
if hasattr(widget, "text") and widget.text():
text_width = fm.horizontalAdvance(widget.text())
max_text_width = max(max_text_width, text_width)
# 检查占位符文本
if hasattr(widget, "placeholderText") and widget.placeholderText():
text_width = fm.horizontalAdvance(widget.placeholderText())
max_text_width = max(max_text_width, text_width)
# 检查下拉框所有选项的宽度
if hasattr(widget, "count"):
for i in range(widget.count()):
item_text = widget.itemText(i)
if item_text:
text_width = fm.horizontalAdvance(item_text)
max_text_width = max(max_text_width, text_width)

# 计算统一宽度(文本宽度 + 边距 + 下拉框箭头空间)
padding = 60 # 左右边距 + 下拉箭头空间
min_width = 165 # 最小宽度
unified_width = max(min_width, max_text_width + padding)

# 设置所有控件的固定宽度
for widget in widgets_to_adjust:
widget.setFixedWidth(int(unified_width))

except Exception as e:
logger.debug(f"调整控件宽度时出错: {e}")

def on_class_changed(self):
"""当班级选择改变时,更新范围选择、性别选择和人数显示"""
self.range_combobox.blockSignals(True)
Expand Down Expand Up @@ -884,6 +932,9 @@ def populate_lists(self):
# 根据总人数是否为0,启用或禁用开始按钮
RollCallUtils.update_start_button_state(self.start_button, total_count)

# 重新调整控件宽度以适应下拉框内容
self._adjustControlWidgetWidths()

except Exception as e:
logger.error(f"延迟填充列表失败: {e}")

Expand Down
116 changes: 116 additions & 0 deletions app/view/main/window.py
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,122 @@ def initNavigation(self):
)
settings_item.clicked.connect(lambda: self.switchTo(self.roll_call_page))

# 调整侧边栏宽度以适应多语言文本
self._adjustNavigationBarWidth()

def _adjustNavigationBarWidth(self):
"""调整导航栏宽度以适应多语言文本,按钮保持正方形,长文本换行"""
try:
nav = self.navigationInterface
if not nav or not hasattr(nav, "buttons"):
return

# 设置按钮的正方形尺寸
button_size = 80 # 正方形按钮的边长

buttons = nav.buttons()
for button in buttons:
button.setFixedSize(button_size, button_size)
# 重写绘制方法使图标和文本整体居中
self._patchButtonDraw(button, button_size)

# 设置导航栏宽度
nav_padding = 8
nav_width = button_size + nav_padding
nav.setFixedWidth(nav_width)

except Exception as e:
logger.debug(f"调整导航栏宽度时出错: {e}")

def _patchButtonDraw(self, button, button_size):
"""修补按钮的绘制方法,使图标和文本整体垂直居中"""
from PySide6.QtCore import QRectF, Qt, QRect
from PySide6.QtGui import QPainter, QFontMetrics
from qfluentwidgets.common.icon import drawIcon, FluentIconBase
from qfluentwidgets.common.color import autoFallbackThemeColor
from qfluentwidgets.common.config import isDarkTheme

def centered_draw_icon(painter: QPainter):
if (button.isPressed or not button.isEnter) and not button.isSelected:
painter.setOpacity(0.6)
if not button.isEnabled():
painter.setOpacity(0.4)

# 计算文本需要的行数和高度
text = button.text()
fm = QFontMetrics(button.font())
text_width = button_size - 8 # 文本区域宽度

# 计算文本换行后的高度
text_rect = QRect(0, 0, text_width, 1000)
bounding = fm.boundingRect(
text_rect, Qt.AlignHCenter | Qt.TextWordWrap, text
)
text_height = bounding.height()

# 计算整体内容高度(图标 + 间距 + 文本)
icon_size = 20
spacing = 4 # 图标和文本之间的间距
total_height = icon_size + spacing + text_height

# 计算垂直居中的起始位置
start_y = (button_size - total_height) / 2
icon_x = (button_size - icon_size) / 2
icon_y = start_y

if hasattr(button, "iconAni") and not button._isSelectedTextVisible:
icon_y += button.iconAni.offset

# 保存计算结果供 _drawText 使用
button._calculated_text_top = start_y + icon_size + spacing

rect = QRectF(icon_x, icon_y, icon_size, icon_size)

selectedIcon = button._selectedIcon or button._icon

if isinstance(selectedIcon, FluentIconBase) and button.isSelected:
color = autoFallbackThemeColor(
button.lightSelectedColor, button.darkSelectedColor
)
selectedIcon.render(painter, rect, fill=color.name())
elif button.isSelected:
drawIcon(selectedIcon, painter, rect)
else:
drawIcon(button._icon, painter, rect)

def wrapped_draw_text(painter: QPainter):
if button.isSelected and not button._isSelectedTextVisible:
return

if button.isSelected:
painter.setPen(
autoFallbackThemeColor(
button.lightSelectedColor, button.darkSelectedColor
)
)
else:
painter.setPen(Qt.white if isDarkTheme() else Qt.black)

painter.setFont(button.font())

text = button.text()

# 使用之前计算的文本顶部位置
text_top = getattr(button, "_calculated_text_top", 36)
text_rect = QRect(
4, int(text_top), button_size - 8, button_size - int(text_top)
)

# 使用 Qt 的自动换行功能
painter.drawText(
text_rect,
Qt.AlignHCenter | Qt.AlignTop | Qt.TextWordWrap,
text,
)

button._drawIcon = centered_draw_icon
button._drawText = wrapped_draw_text

def _toggle_float_window(self):
if self.float_window.isVisible():
self.float_window.hide()
Expand Down
Loading
Loading