77from dataclasses import dataclass
88from typing import Any , Callable
99
10- from PyQt5 .QtCore import Qt
10+ from PyQt5 .QtCore import QObject , pyqtSignal
1111from PyQt5 .QtGui import QColor
1212from PyQt5 .QtWidgets import QPushButton , QColorDialog , QHBoxLayout , QWidget
1313
1414from .base_config import BaseConfig
1515
1616
17+ class ColorChangeSignal (QObject ):
18+ """颜色变化信号发射器"""
19+ changed = pyqtSignal ()
20+
21+
1722@dataclass
1823class ColorConfig (BaseConfig [str ]):
1924 """
@@ -37,15 +42,18 @@ def __post_init__(self) -> None:
3742 if not self .default .startswith ("#" ):
3843 self .default = "#" + self .default
3944
40- def create_widget (self ) -> tuple [QWidget , Callable [[], str ], Callable [[str ], None ]]:
41- """创建颜色选择按钮"""
45+ def create_widget (self ) -> tuple [QWidget , Callable [[], str ], Callable [[str ], None ], QObject ]:
46+ """创建颜色选择按钮,返回 (控件, getter, setter, 信号) """
4247
43- # 创建容器
4448 container = QWidget ()
4549 layout = QHBoxLayout (container )
4650 layout .setContentsMargins (0 , 0 , 0 , 0 )
4751 layout .setSpacing (4 )
4852
53+ # 创建信号发射器,并保存为容器的属性(防止垃圾回收)
54+ signal_emitter = ColorChangeSignal (parent = container )
55+ changed_signal = signal_emitter .changed
56+
4957 # 颜色预览按钮
5058 btn = QPushButton ()
5159 btn .setFixedSize (40 , 24 )
@@ -70,6 +78,7 @@ def on_click():
7078 current_color [0 ] = color_str
7179 btn .setStyleSheet (f"background-color: { color_str } ; border: 1px solid #999;" )
7280 text_btn .setText (color_str )
81+ changed_signal .emit ()
7382
7483 btn .clicked .connect (on_click )
7584 text_btn .clicked .connect (on_click )
@@ -83,7 +92,7 @@ def set_value(value: str) -> None:
8392 btn .setStyleSheet (f"background-color: { value } ; border: 1px solid #999;" )
8493 text_btn .setText (value )
8594
86- return container , get_value , set_value
95+ return container , get_value , set_value , changed_signal
8796
8897 def to_storage (self , value : str ) -> str :
8998 """转换为存储格式"""
0 commit comments