2025-10-31 18:52:31 +08:00
|
|
|
|
from PySide6.QtWidgets import (QWidget, QHBoxLayout, QPushButton, QLineEdit,
|
|
|
|
|
|
QApplication)
|
|
|
|
|
|
from PySide6.QtCore import Qt
|
|
|
|
|
|
from PySide6.QtGui import QDoubleValidator
|
|
|
|
|
|
import sys
|
|
|
|
|
|
|
2026-01-11 18:00:32 +08:00
|
|
|
|
from common.constant_config_manager import ConfigManager
|
|
|
|
|
|
|
2025-11-08 18:25:16 +08:00
|
|
|
|
"""
|
|
|
|
|
|
调整计划方量, 左侧减按钮, 右侧加按钮
|
|
|
|
|
|
这里的 最小值、最大值、初始值 需要读取配置文件来决定
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
class CustomLineEdit(QLineEdit):
|
|
|
|
|
|
def __init__(self, default_text: str, parent=None):
|
|
|
|
|
|
super().__init__(parent)
|
|
|
|
|
|
self.default_text = default_text # 保存初始化时的默认文本
|
|
|
|
|
|
self.setText(self.default_text) # 初始化为默认文本
|
|
|
|
|
|
|
|
|
|
|
|
def focusOutEvent(self, event):
|
|
|
|
|
|
super().focusOutEvent(event) # 先执行父类的焦点离开逻辑
|
|
|
|
|
|
|
|
|
|
|
|
# 检查文本是否为空(或仅含空格)
|
|
|
|
|
|
current_text = self.text().strip()
|
|
|
|
|
|
if not current_text:
|
|
|
|
|
|
self.setText(self.default_text) # 为空则恢复默认值
|
|
|
|
|
|
else: # 不为空,显示一位小数
|
|
|
|
|
|
value = round(float(current_text), 1)
|
|
|
|
|
|
self.setText(f"{value:.1f}")
|
|
|
|
|
|
|
|
|
|
|
|
self.setCursorPosition(0) # 光标移到最前面 (保证数值显示完整)
|
2026-01-11 18:00:32 +08:00
|
|
|
|
|
|
|
|
|
|
# 更新输入框的默认文本
|
|
|
|
|
|
def updateDefaultText(self, text:str):
|
|
|
|
|
|
self.default_text = text
|
|
|
|
|
|
|
2025-11-08 18:25:16 +08:00
|
|
|
|
|
2025-10-31 18:52:31 +08:00
|
|
|
|
class ValueAdjuster(QWidget):
|
|
|
|
|
|
def __init__(self, parent=None):
|
|
|
|
|
|
super().__init__(parent)
|
2026-01-11 18:00:32 +08:00
|
|
|
|
self.config_manager = ConfigManager()
|
|
|
|
|
|
self.config_manager.adjuster_params_changed.connect(self.on_adjuster_params_changed) # 绑定参数变化槽函数
|
|
|
|
|
|
|
|
|
|
|
|
# self.min_value = 0.0 # 最小值
|
|
|
|
|
|
# self.max_value = 99.0 # 最大值
|
|
|
|
|
|
# self.value = 2.5 # 初始值 (需要显示一位数字)
|
|
|
|
|
|
|
|
|
|
|
|
self.min_value = self.config_manager.get_adjuster_min() # 最小值
|
|
|
|
|
|
self.max_value = self.config_manager.get_adjuster_max() # 最大值
|
|
|
|
|
|
self.value = self.config_manager.get_adjuster_initial() # 初始值 (需要显示一位小数)
|
2025-10-31 18:52:31 +08:00
|
|
|
|
|
|
|
|
|
|
self.setFixedSize(102, 32)
|
|
|
|
|
|
|
|
|
|
|
|
# 创建控件
|
|
|
|
|
|
# 减号按钮
|
|
|
|
|
|
self.minus_btn = QPushButton("-")
|
|
|
|
|
|
self.minus_btn.setFixedSize(26, 26)
|
|
|
|
|
|
self.minus_btn.setCursor(Qt.PointingHandCursor)
|
|
|
|
|
|
|
|
|
|
|
|
# 中间的编辑栏
|
2025-11-08 18:25:16 +08:00
|
|
|
|
# 支持显示两位小数
|
|
|
|
|
|
# self.line_edit = QLineEdit(f"{self.value:.1f}") # 显示1位小数
|
|
|
|
|
|
self.line_edit = CustomLineEdit(f"{self.value:.1f}") # 显示1位小数
|
2025-10-31 18:52:31 +08:00
|
|
|
|
self.line_edit.setFixedSize(40, 26)
|
|
|
|
|
|
|
|
|
|
|
|
# 加号按钮
|
|
|
|
|
|
self.plus_btn = QPushButton("+")
|
|
|
|
|
|
self.plus_btn.setFixedSize(26, 26)
|
|
|
|
|
|
self.plus_btn.setCursor(Qt.PointingHandCursor)
|
|
|
|
|
|
|
|
|
|
|
|
# 配置QLineEdit:支持数字输入+居中显示
|
|
|
|
|
|
self.line_edit.setAlignment(Qt.AlignCenter) # 文本居中
|
2025-11-08 18:25:16 +08:00
|
|
|
|
# 限制输入为浮点数(范围可自定义)
|
|
|
|
|
|
self.line_edit.setValidator(QDoubleValidator(self.min_value, self.max_value, 1, self)) # 最多1位小数 (必选)
|
2025-10-31 18:52:31 +08:00
|
|
|
|
self.line_edit.textChanged.connect(self.on_text_changed) # 监听输入变化
|
|
|
|
|
|
|
|
|
|
|
|
# 设置样式表(保持与按钮风格统一)
|
|
|
|
|
|
self.minus_btn.setStyleSheet("""
|
|
|
|
|
|
QPushButton {
|
|
|
|
|
|
background-color: #001c83;
|
|
|
|
|
|
color: #03f5ff;
|
|
|
|
|
|
border: 1px solid #039ec3;
|
|
|
|
|
|
font-size: 29px;
|
|
|
|
|
|
text-align: center;
|
|
|
|
|
|
padding-bottom: 4px;
|
|
|
|
|
|
}
|
|
|
|
|
|
QPushButton:hover {
|
|
|
|
|
|
background-color: #16ffff;
|
|
|
|
|
|
color: #00347e;
|
|
|
|
|
|
}
|
|
|
|
|
|
""")
|
|
|
|
|
|
|
|
|
|
|
|
# #03f5ff
|
|
|
|
|
|
self.line_edit.setStyleSheet("""
|
|
|
|
|
|
QLineEdit {
|
|
|
|
|
|
background-color: #001c83;
|
|
|
|
|
|
color: white;
|
|
|
|
|
|
border: 1px solid #039ec3;
|
|
|
|
|
|
font-size: 16px;
|
|
|
|
|
|
padding:0px;
|
|
|
|
|
|
font-weight: 560;
|
|
|
|
|
|
}
|
|
|
|
|
|
QLineEdit:focus {
|
|
|
|
|
|
border: 1px solid #039ec3;
|
|
|
|
|
|
outline: none;
|
|
|
|
|
|
}
|
|
|
|
|
|
""")
|
|
|
|
|
|
|
|
|
|
|
|
self.plus_btn.setStyleSheet("""
|
|
|
|
|
|
QPushButton {
|
|
|
|
|
|
background-color: #001c83;
|
|
|
|
|
|
color: #03f5ff;
|
|
|
|
|
|
border: 1px solid #039ec3;
|
|
|
|
|
|
font-size: 29px;
|
|
|
|
|
|
text-align: center;
|
|
|
|
|
|
padding-bottom: 4px;
|
|
|
|
|
|
margin: 0px;
|
|
|
|
|
|
}
|
|
|
|
|
|
QPushButton:hover {
|
|
|
|
|
|
background-color: #16ffff;
|
|
|
|
|
|
color: #00347e;
|
|
|
|
|
|
}
|
|
|
|
|
|
""")
|
|
|
|
|
|
|
|
|
|
|
|
# 连接信号槽(加减按钮)
|
|
|
|
|
|
self.minus_btn.clicked.connect(self.on_minus_clicked)
|
|
|
|
|
|
self.plus_btn.clicked.connect(self.on_plus_clicked)
|
|
|
|
|
|
|
|
|
|
|
|
# 设置布局(间距0,确保边框无缝衔接)
|
|
|
|
|
|
layout = QHBoxLayout(self)
|
|
|
|
|
|
layout.setSpacing(2)
|
|
|
|
|
|
layout.setContentsMargins(0, 0, 0, 0) # 去除布局外边距
|
|
|
|
|
|
layout.addWidget(self.minus_btn)
|
|
|
|
|
|
layout.addWidget(self.line_edit)
|
|
|
|
|
|
layout.addWidget(self.plus_btn)
|
|
|
|
|
|
|
2026-01-11 18:00:32 +08:00
|
|
|
|
def on_adjuster_params_changed(self, new_min, new_max, new_initial):
|
|
|
|
|
|
"""配置文件中的min、max、initial变化时, 更新控件范围"""
|
|
|
|
|
|
# print("on_adjuster_params_changed:", new_min, new_max, new_initial)
|
|
|
|
|
|
# 1、更新最小值和最大值
|
|
|
|
|
|
if self.min_value != new_min or self.max_value != new_max:
|
|
|
|
|
|
self.min_value = new_min
|
|
|
|
|
|
self.max_value = new_max
|
|
|
|
|
|
self.line_edit.setValidator(QDoubleValidator(self.min_value, self.max_value, 1, self))
|
|
|
|
|
|
|
|
|
|
|
|
# 2、确保当前值在新范围内,不在当前范围内,就更新当前值
|
|
|
|
|
|
if self.value < new_min:
|
|
|
|
|
|
self.value = new_min
|
|
|
|
|
|
self.line_edit.setText(f"{self.value:.1f}")
|
|
|
|
|
|
elif self.value > new_max:
|
|
|
|
|
|
self.value = new_max
|
|
|
|
|
|
self.line_edit.setText(f"{self.value:.1f}")
|
|
|
|
|
|
|
|
|
|
|
|
# 3、更新输入编辑框默认值
|
|
|
|
|
|
self.line_edit.updateDefaultText(f"{new_initial:.1f}")
|
|
|
|
|
|
|
2025-10-31 18:52:31 +08:00
|
|
|
|
def on_minus_clicked(self):
|
|
|
|
|
|
"""减0.1"""
|
|
|
|
|
|
new_value = self.value - 0.1
|
|
|
|
|
|
# 限制最小值:不低于min_value
|
|
|
|
|
|
if new_value >= self.min_value:
|
|
|
|
|
|
self.value = round(new_value, 1)
|
|
|
|
|
|
self.line_edit.setText(f"{self.value:.1f}")
|
|
|
|
|
|
|
|
|
|
|
|
def on_plus_clicked(self):
|
|
|
|
|
|
"""加0.1"""
|
|
|
|
|
|
new_value = self.value + 0.1
|
|
|
|
|
|
# 限制最大值:不超过max_value
|
|
|
|
|
|
if new_value <= self.max_value:
|
|
|
|
|
|
self.value = round(new_value, 1)
|
|
|
|
|
|
self.line_edit.setText(f"{self.value:.1f}")
|
|
|
|
|
|
|
|
|
|
|
|
def on_text_changed(self, text):
|
2025-11-08 18:25:16 +08:00
|
|
|
|
"""监听输入框文本变化, 更新内部value"""
|
2025-10-31 18:52:31 +08:00
|
|
|
|
if not text:
|
|
|
|
|
|
return
|
|
|
|
|
|
try:
|
|
|
|
|
|
input_value = round(float(text), 1)
|
|
|
|
|
|
# 确保输入值在范围内
|
|
|
|
|
|
if self.min_value <= input_value <= self.max_value:
|
|
|
|
|
|
self.value = input_value
|
|
|
|
|
|
else:
|
|
|
|
|
|
# 超出范围时恢复到最近的有效 value
|
|
|
|
|
|
self.line_edit.setText(f"{self.value:.1f}")
|
|
|
|
|
|
except ValueError:
|
|
|
|
|
|
pass
|
|
|
|
|
|
|
2025-11-08 18:25:16 +08:00
|
|
|
|
# 获取具体的方量数值,float类型 (一位小数)
|
2025-10-31 18:52:31 +08:00
|
|
|
|
def get_value(self):
|
|
|
|
|
|
return self.value
|
|
|
|
|
|
|
|
|
|
|
|
# 设置方量值
|
|
|
|
|
|
def set_value(self, value:float):
|
|
|
|
|
|
input_value = round(float(value), 1)
|
|
|
|
|
|
# 确保设置的值在范围内
|
|
|
|
|
|
if self.min_value <= input_value <= self.max_value:
|
|
|
|
|
|
self.value = input_value
|
|
|
|
|
|
self.line_edit.setText(f"{self.value:.1f}") # 更新方量值
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
|
app = QApplication(sys.argv)
|
|
|
|
|
|
widget = ValueAdjuster()
|
|
|
|
|
|
widget.show()
|
|
|
|
|
|
sys.exit(app.exec())
|