add(更新opcua客户端、振捣频率按钮、管片任务数据刷新)

This commit is contained in:
2026-01-16 18:37:21 +08:00
parent 360cb13b73
commit 88dfc53b9d
13 changed files with 567 additions and 234 deletions

View File

@ -249,7 +249,15 @@ class ArcProgressWidget(QWidget):
Args:
progress: 传入去掉百分号之后的数值, 如80%, 传入80
"""
self.arc_progress.progress = progress
try:
if isinstance(progress, str):
progress = progress.strip().replace("%", "")
progress_int = int(float(progress))
progress_int = max(0, min(100, progress_int))
self.arc_progress.progress = progress_int
except (ValueError, TypeError):
pass # 传入的生产进度类型错误,维持原进度
# 重量设置 (单位kg)
def setWeight(self, weight:float):

View File

@ -60,6 +60,8 @@ class ConveyorSystemWidget(QWidget):
if outer_pixmap.isNull():
print(f"警告:图片 {outer_img} 加载失败,请检查路径!")
return group
outer_width = outer_pixmap.width()
outer_height = outer_pixmap.height()
group.setFixedSize(outer_pixmap.size()) # 设置尺寸, 大小和外框一样
@ -85,6 +87,14 @@ class ConveyorSystemWidget(QWidget):
self.upper_inner_label.move(14, 9)
self.upper_inner_label.setAlignment(Qt.AlignBottom)
# 重量文字(上位)
self.upper_weight_label = QLabel("5000kg", upper_bg_widget)
self.upper_weight_label.setAlignment(Qt.AlignCenter)
self.upper_weight_label.setStyleSheet("background: none; background-color: #003669; color: #16ffff; font-size: 18px;")
# self.upper_weight_label.setFixedSize(93, 22)
self.upper_weight_label.setFixedSize(120, 29)
self.upper_weight_label.move(outer_width//2 - 60, outer_height//2 - 46)
return group
def _update_upper_inner_height(self, total_weight, current_weight: float):
@ -123,6 +133,9 @@ class ConveyorSystemWidget(QWidget):
# 2、将self._last_upper_hopper_weight设置为当前重量
self._last_upper_hopper_weight = weight
# 3、更新重量显示文字
self.upper_weight_label.setText(f"{weight}kg")
def create_conveyor(self):
"""创建传送带组件包含左右齿轮group容器背景为传送带图片"""
group = QWidget()

View File

@ -0,0 +1,150 @@
from PySide6.QtWidgets import (QWidget, QPushButton, QVBoxLayout,
QSizePolicy)
from PySide6.QtCore import Signal, Qt, QObject
from PySide6.QtGui import QFont
class FrequencyButtonGroup(QWidget):
"""振捣频率选择按钮组"""
# 该信号frequency_changed用于振捣频率的控制逻辑表示需要按照int类型的频率开始振捣
frequency_changed = Signal(int) # 选中切换信号(新选中频率)
# 该信号frequency_cleared用于停止振捣
frequency_cleared = Signal() # 取消选中信号(无参数)
def __init__(self, parent=None):
super().__init__(parent)
self.setFixedSize(115, 159)
self._init_ui()
self._selected_freq = None # 当前选中的频率None表示未选中
def _init_ui(self):
"""初始化UI:垂直排列3个按钮, 设置样式和交互"""
# 1. 布局垂直排列间隔16px
self.layout = QVBoxLayout(self)
self.layout.setSpacing(16) # 按钮间间隔16px
self.layout.setContentsMargins(0, 0, 0, 0) # 去除外层边距
self.layout.setAlignment(Qt.AlignCenter) # 按钮垂直居中
# 2. 按钮配置:频率列表、样式
self.freq_buttons = {} # 存储按钮映射:{频率值: 按钮实例}
freq_list = [220, 230, 240] # 频率设置,设置三个频率
font = QFont()
font.setPointSize(15) # 字体大小15px
for freq in freq_list:
btn = QPushButton(f"{freq}Hz", self)
btn.setFont(font)
btn.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) # 固定尺寸
btn.setFixedSize(96, 36) # 按钮固定大小(匹配背景图尺寸)
btn.setCursor(Qt.PointingHandCursor)
# 3. 绑定点击事件
btn.clicked.connect(lambda checked, target_freq=freq: self._on_btn_clicked(target_freq))
# 4. 设置默认样式(未选中状态)
self._set_btn_style(btn, is_selected=False)
# 5. 添加到布局和映射表
self.layout.addWidget(btn)
self.freq_buttons[freq] = btn
# 6. 禁止布局拉伸(按钮垂直居中,不填充多余空间)
self.layout.addStretch()
def _set_btn_style(self, btn, is_selected: bool):
"""设置按钮样式"""
if is_selected:
btn.setStyleSheet("""
QPushButton {
background-image: url(images/频率按钮2.png);
background-repeat: no-repeat;
background-position: center;
background-origin: content-box;
background-clip: content-box;
color: #05267d;
border: none;
padding: 0px;
}
QPushButton:hover {
opacity: 0.95;
background-image: url(images/频率按钮2.png);
background-repeat: no-repeat;
background-position: center;
background-origin: content-box;
background-clip: content-box;
}
""")
else:
btn.setStyleSheet("""
QPushButton {
background-image: url(images/频率按钮1.png);
background-repeat: no-repeat;
background-position: center;
background-origin: content-box;
background-clip: content-box;
color: #3bfff8;
border: none;
padding: 0px;
}
QPushButton:hover {
opacity: 0.95;
background-image: url(images/频率按钮1.png);
background-repeat: no-repeat;
background-position: center;
background-origin: content-box;
background-clip: content-box;
}
""")
btn.repaint()
def _on_btn_clicked(self, target_freq):
"""按钮点击事件:支持切换选中/取消选中"""
if target_freq == self._selected_freq:
self.clear_selection()
self.frequency_cleared.emit()
return
if self._selected_freq is not None:
prev_btn = self.freq_buttons[self._selected_freq]
self._set_btn_style(prev_btn, is_selected=False)
current_btn = self.freq_buttons[target_freq]
self._set_btn_style(current_btn, is_selected=True)
self._selected_freq = target_freq
self.frequency_changed.emit(target_freq)
def _set_frequency_show(self, target_freq:int):
"""设置振捣频率, 只修改显示, 不控制变频器"""
if self._selected_freq is not None:
prev_btn = self.freq_buttons[self._selected_freq]
self._set_btn_style(prev_btn, is_selected=False)
current_btn = self.freq_buttons[target_freq]
self._set_btn_style(current_btn, is_selected=True)
self._selected_freq = target_freq
# ------------------- 外部接口 -------------------
def set_selected_frequency(self, freq: int):
""" 设置显示选中的频率, 只显示不控制 """
try:
freq_int = int(freq)
if freq_int not in self.freq_buttons:
# 除了220、230、240其他的数值(比如:0)都表示取消显示的频率
self.clear_selection()
return
self._set_frequency_show(freq_int)
except (ValueError, TypeError):
pass # 传入的振捣频率类型错误,维持原频率
def get_selected_frequency(self):
"""获取当前选中的频率(外部接口),没有选中返回None"""
return self._selected_freq
def clear_selection(self):
"""清除所有选中状态(内部调用+外部接口)"""
if self._selected_freq is not None:
prev_btn = self.freq_buttons[self._selected_freq]
self._set_btn_style(prev_btn, is_selected=False)
self._selected_freq = None

View File

@ -176,13 +176,21 @@ class ProductionProgressWidget(QWidget):
self.animation.setEndValue(100)
self.animation.start()
def setProgress(self, progress: float):
def setProgress(self, progress: int):
"""
设置progress之后, 会根据该值调整进度条
Args:
progress: 传入去掉百分号之后的数值, 如80%, 传入80.0
progress: 传入去掉百分号之后的数值, 如80%, 传入80
"""
self.linear_progress.progress = progress
try:
if isinstance(progress, str):
progress = progress.strip().replace("%", "")
progress_int = int(float(progress))
progress_int = max(0, min(100, progress_int))
self.linear_progress.progress = progress_int
except (ValueError, TypeError):
pass # 生产进度更新失败,维持原进度
if __name__ == "__main__":

View File

@ -257,9 +257,9 @@ class SegmentDetailsDialog(QDialog):
row: 左列网格行号(0-6,共7行)
new_label_text: 新的标签文字(如“管片编号”)
"""
if 0 <= row < len(self.left_cells):
if new_label_text and 0 <= row < len(self.left_cells):
cell = self.left_cells[row]
cell.label.setText(new_label_text)
cell.label.setText(str(new_label_text))
def set_left_value(self, row, new_value_text:str):
"""
@ -268,9 +268,9 @@ class SegmentDetailsDialog(QDialog):
row: 左列网格行号(0-6,共7行)
new_value_text: 新的值(如“FB789”)
"""
if 0 <= row < len(self.left_cells):
if new_value_text and 0 <= row < len(self.left_cells):
cell = self.left_cells[row]
cell.value.setText(new_value_text)
cell.value.setText(str(new_value_text))
def set_right_label(self, row, new_label_text:str):
"""
@ -279,9 +279,9 @@ class SegmentDetailsDialog(QDialog):
row: 右列网格行号(0-6,共7行)
new_label_text: 新的标签文字(如“分块号”)
"""
if 0 <= row < len(self.right_cells):
if new_label_text and 0 <= row < len(self.right_cells):
cell = self.right_cells[row]
cell.label.setText(new_label_text)
cell.label.setText(str(new_label_text))
def set_right_value(self, row, new_value_text:str):
"""
@ -290,9 +290,9 @@ class SegmentDetailsDialog(QDialog):
row: 右列网格行号(0-6,共7行)
new_value_text: 新的值(如“FB789”)
"""
if 0 <= row < len(self.left_cells):
if new_value_text and 0 <= row < len(self.left_cells):
cell = self.right_cells[row]
cell.value.setText(new_value_text)
cell.value.setText(str(new_value_text))
# 测试代码