Files
Feeding_control_system/view/widgets/value_adjuster.py

204 lines
7.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from PySide6.QtWidgets import (QWidget, QHBoxLayout, QPushButton, QLineEdit,
QApplication)
from PySide6.QtCore import Qt
from PySide6.QtGui import QDoubleValidator
import sys
from common.constant_config_manager import ConfigManager
"""
调整计划方量, 左侧减按钮, 右侧加按钮
这里的 最小值、最大值、初始值 需要读取配置文件来决定
"""
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) # 光标移到最前面 (保证数值显示完整)
# 更新输入框的默认文本
def updateDefaultText(self, text:str):
self.default_text = text
class ValueAdjuster(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
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() # 初始值 (需要显示一位小数)
self.setFixedSize(102, 32)
# 创建控件
# 减号按钮
self.minus_btn = QPushButton("-")
self.minus_btn.setFixedSize(26, 26)
self.minus_btn.setCursor(Qt.PointingHandCursor)
# 中间的编辑栏
# 支持显示两位小数
# self.line_edit = QLineEdit(f"{self.value:.1f}") # 显示1位小数
self.line_edit = CustomLineEdit(f"{self.value:.1f}") # 显示1位小数
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) # 文本居中
# 限制输入为浮点数(范围可自定义)
self.line_edit.setValidator(QDoubleValidator(self.min_value, self.max_value, 1, self)) # 最多1位小数 (必选)
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)
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}")
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):
"""监听输入框文本变化, 更新内部value"""
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
# 获取具体的方量数值float类型 (一位小数)
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())