From 5712e1b7f8bf0c1c762c4f1b7083eb9e00ba0405 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E5=B1=B1=E5=85=AC=E4=BB=94?= Date: Sun, 24 May 2026 01:27:10 +0800 Subject: [PATCH 1/2] =?UTF-8?q?[=E4=BC=98=E5=8C=96]=20ColorPickerDialog=20?= =?UTF-8?q?=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96=E4=B8=8E=E4=B8=BB=E9=A2=98?= =?UTF-8?q?=E9=80=82=E9=85=8D=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - PresetGrid 从 48 个 QLabel 改为 paintEvent 自绘,减少 widget 数量 - 消除 GredientSlider 中硬编码颜色,改用 theme_colors 函数 - ColorModeSliders 新增 _update_styles() 方法,主题切换时更新文字颜色 - ColorPreview 默认色改用 get_placeholder_color() 跟随主题 - ColorPickerDialog._update_styles() 级联更新子组件样式 - 修复双重 disconnect 导致的 RuntimeWarning - 清理未使用导入和冗余代码 --- dialogs/edit_palette.py | 125 +++++++++++++++++++++------------------- 1 file changed, 65 insertions(+), 60 deletions(-) diff --git a/dialogs/edit_palette.py b/dialogs/edit_palette.py index 9c85296..5183153 100644 --- a/dialogs/edit_palette.py +++ b/dialogs/edit_palette.py @@ -5,9 +5,9 @@ from datetime import datetime from typing import Any # 第三方库导入 -from PySide6.QtCore import Qt, QTimer, Signal, QPoint, QRect, QMimeData +from PySide6.QtCore import Qt, QTimer, Signal, QPoint, QRect, QRectF, QMimeData from PySide6.QtWidgets import ( - QHBoxLayout, QLabel, QVBoxLayout, QWidget, QGridLayout, QApplication, QDialog + QHBoxLayout, QLabel, QVBoxLayout, QWidget, QApplication, QDialog ) from PySide6.QtGui import QColor, QPainter, QLinearGradient, QBrush, QPen, QMouseEvent, QDrag, QPixmap from qfluentwidgets import ( @@ -22,7 +22,7 @@ from core import ( ) from core.config import get_config_manager from utils import tr, load_icon_universal -from utils.theme_colors import get_text_color, get_border_color +from utils.theme_colors import get_text_color, get_border_color, get_placeholder_color, get_picker_fill_color # 对话框模块导入 from .base_frameless_dialog import BaseFramelessDialog @@ -56,55 +56,44 @@ class PresetGrid(QWidget): color_selected = Signal(int, int, int) # 信号:RGB颜色被选中 + ROWS = 8 + COLS = 6 + CELL_MARGIN = 3 + def __init__(self, parent=None): super().__init__(parent) - self._selected_color = None - self._color_buttons = [] - self.setup_ui() + self.setCursor(Qt.CursorShape.PointingHandCursor) + self.setMinimumSize(120, 120) - def setup_ui(self): - """设置界面""" - layout = QGridLayout(self) - layout.setContentsMargins(0, 0, 0, 0) - layout.setSpacing(6) - - # 设置行列拉伸因子,使颜色块均匀分布 - for row in range(8): - layout.setRowStretch(row, 1) - for col in range(6): - layout.setColumnStretch(col, 1) - - # 创建48个颜色块 - for row in range(8): - for col in range(6): - color_hex = PRESET_COLORS[row][col] - btn = self._create_color_button(color_hex) - layout.addWidget(btn, row, col) - self._color_buttons.append((btn, color_hex)) - - def _create_color_button(self, color_hex: str) -> QLabel: - """创建颜色按钮""" - btn = QLabel(self) - btn.setMinimumSize(24, 24) - btn.setStyleSheet(f""" - QLabel {{ - background-color: {color_hex}; - border: 1px solid {get_border_color().name()}; - border-radius: 2px; - }} - QLabel:hover {{ - border: 2px solid {get_text_color().name()}; - }} - """) - btn.setCursor(Qt.CursorShape.PointingHandCursor) - btn.mousePressEvent = lambda e, c=color_hex: self._on_color_clicked(c) - return btn + def paintEvent(self, event): + """自绘8×6预设颜色网格""" + painter = QPainter(self) + painter.setRenderHint(QPainter.RenderHint.Antialiasing) - def _on_color_clicked(self, color_hex: str): - """颜色被点击""" - r, g, b = hex_to_rgb(color_hex) - self._selected_color = (r, g, b) - self.color_selected.emit(r, g, b) + cell_w = self.width() / self.COLS + cell_h = self.height() / self.ROWS + m = self.CELL_MARGIN + + for row in range(self.ROWS): + for col in range(self.COLS): + x = col * cell_w + m + y = row * cell_h + m + w = cell_w - m * 2 + h = cell_h - m * 2 + rect = QRectF(x, y, w, h) + r, g, b = hex_to_rgb(PRESET_COLORS[row][col]) + painter.setBrush(QColor(r, g, b)) + painter.setPen(QPen(get_border_color(), 1)) + painter.drawRoundedRect(rect, 2, 2) + + def mousePressEvent(self, event): + """点击定位颜色格""" + if event.button() == Qt.MouseButton.LeftButton: + col = int(event.position().x() / self.width() * self.COLS) + row = int(event.position().y() / self.height() * self.ROWS) + if 0 <= row < self.ROWS and 0 <= col < self.COLS: + r, g, b = hex_to_rgb(PRESET_COLORS[row][col]) + self.color_selected.emit(r, g, b) class ColorPreview(QWidget): @@ -112,7 +101,7 @@ class ColorPreview(QWidget): def __init__(self, parent=None): super().__init__(parent) - self._color = QColor(128, 128, 128) # 默认灰色 + self._color = get_placeholder_color() self.setFixedSize(100, 60) def set_color(self, r: int, g: int, b: int): @@ -175,15 +164,15 @@ class GradientSlider(QWidget): if self._gradient: painter.fillRect(track_rect, QBrush(self._gradient)) else: - painter.fillRect(track_rect, QBrush(QColor(200, 200, 200))) + painter.fillRect(track_rect, QBrush(get_placeholder_color())) # 计算滑块位置 ratio = (self._value - self._min_val) / (self._max_val - self._min_val) x_pos = int(ratio * (self.width() - 16)) + 8 # 绘制滑块指示器(圆形) - painter.setPen(QPen(QColor(255, 255, 255), 2)) - painter.setBrush(QColor(255, 255, 255)) + painter.setPen(QPen(get_picker_fill_color(), 2)) + painter.setBrush(get_picker_fill_color()) painter.drawEllipse(QPoint(x_pos, 10), 8, 8) # 绘制边框 @@ -244,9 +233,9 @@ class ColorModeSliders(QWidget): layout.setSpacing(8) # 模式标题 - title = QLabel(f"{self._mode}:") - title.setStyleSheet(f"color: {get_text_color().name()}; font-size: 12px; background: transparent;") - layout.addWidget(title) + self._title_label = QLabel(f"{self._mode}:") + self._title_label.setStyleSheet(f"color: {get_text_color().name()}; font-size: 12px; background: transparent;") + layout.addWidget(self._title_label) # 创建3个滑块 for i, (name, min_val, max_val, unit) in enumerate(self._params): @@ -275,6 +264,17 @@ class ColorModeSliders(QWidget): label.setText(f"{value}{unit}") self.value_changed.emit() + def _update_styles(self): + """更新样式以适配主题""" + text_color = get_text_color() + self._title_label.setStyleSheet( + f"color: {text_color.name()}; font-size: 12px; background: transparent;" + ) + for label, _unit in self._labels: + label.setStyleSheet( + f"color: {text_color.name()}; font-size: 11px; background: transparent;" + ) + def set_values(self, values: tuple[float, ...]): """设置滑块值""" for i, value in enumerate(values): @@ -450,12 +450,17 @@ class ColorPickerDialog(BaseFramelessDialog): def closeEvent(self, event): """关闭事件""" - try: - qconfig.themeChangedFinished.disconnect(self._theme_connection) - except (TypeError, RuntimeError): - pass super().closeEvent(event) + def _update_styles(self): + """更新样式以适配主题""" + super()._update_styles() + self._update_hex_input_style() + if hasattr(self, 'mode1_sliders'): + self.mode1_sliders._update_styles() + if hasattr(self, 'mode2_sliders'): + self.mode2_sliders._update_styles() + def setup_ui(self): """设置界面布局""" main_layout = QVBoxLayout(self) @@ -687,7 +692,7 @@ class ColorPickerDialog(BaseFramelessDialog): def _update_hex_input_style(self): """更新HEX输入框样式""" - if not self.hex_input: + if not hasattr(self, 'hex_input') or not self.hex_input: return primary_color = get_text_color(secondary=False) -- Gitee From 156621268b531ac49215628f6e47e5be6c2b5594 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E5=B1=B1=E5=85=AC=E4=BB=94?= Date: Sun, 24 May 2026 17:00:28 +0800 Subject: [PATCH 2/2] =?UTF-8?q?[=E5=86=85=E5=AE=B9=E8=B0=83=E6=95=B4]=20?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- version.py | 2 +- version.txt | 4 ++-- version_info.txt | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/version.py b/version.py index c74f2dc..4300633 100644 --- a/version.py +++ b/version.py @@ -11,7 +11,7 @@ class VersionManager: self.major: int = 1 self.minor: int = 10 self.patch: int = 1 - self.build: int = 0 + self.build: int = 1 self.prerelease: str = "" # 核心版本信息 diff --git a/version.txt b/version.txt index 481fc62..49aab82 100644 --- a/version.txt +++ b/version.txt @@ -1,6 +1,6 @@ 1.10.1 -2026.5.24.1 -1.10.1.0 +2026.5.24.2 +1.10.1.1 浮晓 HXiao Studio © 2026 浮晓 HXiao Studio 取色卡(Color Card) - 一站式色彩工具 \ No newline at end of file diff --git a/version_info.txt b/version_info.txt index 7d48e0b..38dfc1d 100644 --- a/version_info.txt +++ b/version_info.txt @@ -1,7 +1,7 @@ VSVersionInfo( ffi=FixedFileInfo( - filevers=(2026,5,24,1), - prodvers=(1,10,1,0), + filevers=(2026,5,24,2), + prodvers=(1,10,1,1), mask=0x3f, flags=0x0, OS=0x4, -- Gitee