Files
zjsh_weight_system_ui/weight_dialog.py

229 lines
7.8 KiB
Python
Raw Normal View History

2025-11-16 11:58:22 +08:00
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
# @Time : 2025/11/10 11:29
# @Author : reenrr
# @Description : 重量显示界面,显示上料斗重量、下料斗重量
'''
from PySide6.QtWidgets import (
QApplication,
QDialog,
QVBoxLayout,
QHBoxLayout,
QGridLayout,
QLabel,
QWidget,
QPushButton,
)
from PySide6.QtGui import QPixmap, QFont, QPainter, QIcon
from PySide6.QtCore import Qt, QEvent, QSize, QTimer, Slot
from PySide6.QtNetwork import QTcpSocket, QAbstractSocket
import sys
import json
from datetime import datetime
class WeightDetailsDialog(QDialog):
"""
上料斗下料斗重量显示界面
"""
def __init__(self, parent=None, title="上料斗重量" ):
super().__init__(parent)
self.setAttribute(Qt.WA_TranslucentBackground)
self.digit_labels = [] #用于存储数字标签的列表
self.default_icon_path = "选择_未实时.png" # 未连接图标
self.connected_icon_path = "选择_实时.png" # 已连接图标
self.check_label = None # 状态图标标签
self.is_running = False # 定时器是否运行
self.latest_json_data = {}
self.statusWidgets = [] # 状态显示控件列表
self._init_ui(title)
# -----------------------
# 界面初始化函数
# -----------------------
def _init_ui(self, title):
self.setWindowFlags(Qt.FramelessWindowHint)
self._load_background()
main_layout = QVBoxLayout(self)
main_layout.setContentsMargins(32, 20, 32, 50)
main_layout.setSpacing(0)
# 1. 顶部区域(标题 + 关闭按钮)
self._add_top_area(main_layout, title)
# 2. 状态显示+重量框
self._add_state_weight_area(main_layout)
def _load_background(self):
self.bg_pixmap = QPixmap("重量背景.png") # 修改为派单任务背景图
if self.bg_pixmap.isNull():
print("错误:重量背景.png 加载失败,请检查路径!")
self.setFixedSize(800, 500)
else:
self.setFixedSize(self.bg_pixmap.size())
def _add_top_area(self, parent_layout, title):
top_layout = QHBoxLayout()
top_layout.setContentsMargins(0, 0, 0, 36)
top_layout.addStretch()
title_label = QLabel(title)
font = QFont()
font.setPixelSize(24)
font.setLetterSpacing(QFont.AbsoluteSpacing, 2)
font.setBold(True)
title_label.setFont(font)
title_label.setStyleSheet("color: #13fffc; font-weight: Bold;")
title_label.setAlignment(Qt.AlignCenter)
top_layout.addWidget(title_label, alignment=Qt.AlignTop)
# 关闭按钮
top_layout.addStretch()
parent_layout.addLayout(top_layout)
def _add_state_weight_area(self, parent_layout):
grid_layout = QGridLayout()
grid_layout.setSpacing(12)
weight_widget = self._create_info_weight()
grid_layout.addWidget(weight_widget)
parent_layout.addLayout(grid_layout)
def _create_info_weight(self):
# 1、创建最外层水平布局容纳所有元素
weight_layout = QHBoxLayout()
weight_layout.setContentsMargins(0, 0, 0, 0)
weight_layout.setSpacing(0)
# 2、创建确认图标
self.check_label = QLabel()
self._update_status_icon(False)
weight_layout.addWidget(self.check_label)
weight_layout.setSpacing(50)
# 3、创建“6个数字单元格”
digit_font = QFont()
digit_font.setPixelSize(70)
digit_font.setLetterSpacing(QFont.AbsoluteSpacing, 2)
digit_font.setBold(False)
digit_pixmap = QPixmap("数字.png")
digit_size = digit_pixmap.size()
for i in range(6):
# 数字标签
digit_label = QLabel("")
digit_label.setFixedSize(digit_size)
digit_label.setFont(digit_font)
digit_label.setAlignment(Qt.AlignCenter)
digit_label.setStyleSheet("color: white")
# 若图片存在,设置背景图片
if not digit_pixmap.isNull():
digit_label.setStyleSheet("""
QLabel {
color: white;
background-image: url(数字.png);
background-repeat: no-repeat;
background-position: center;
}
""")
weight_layout.addWidget(digit_label)
self.digit_labels.append(digit_label)
if i < 5:
weight_layout.addSpacing(5)
# 4、创建“kg”单位单元格
unit_label = QLabel("kg")
unit_label.setFixedSize(digit_size)
unit_label.setFont(digit_font)
unit_label.setAlignment(Qt.AlignCenter)
if not digit_pixmap.isNull():
unit_label.setStyleSheet("""
QLabel {
color: white;
background-image: url(数字.png);
background-repeat: no-repeat;
background-position: center;
}
""")
weight_layout.addSpacing(5)
weight_layout.addWidget(unit_label)
# 5、将主布局设置到父控件
weight_widget = QWidget()
weight_widget.setLayout(weight_layout)
weight_widget.setObjectName("infoWeight")
return weight_widget
def eventFilter(self, obj, event):
"""
实现事件过滤器动态修改右侧值颜色
"""
# 只处理父控件infoCell的事件
if obj.objectName() == "infoCell":
# 鼠标进入父控件 → 改#13f0f3
if event.type() == QEvent.Enter:
if hasattr(obj, "value"): # 确保存在value控件
obj.value.setStyleSheet("background: none; color: #13f0f3;")
# 鼠标离开父控件 → 恢复默认色
elif event.type() == QEvent.Leave:
if hasattr(obj, "value"):
obj.value.setStyleSheet("background: none; color: #9fbfd4;")
return super().eventFilter(obj, event)
def paintEvent(self, event):
if not self.bg_pixmap.isNull():
painter = QPainter(self)
painter.drawPixmap(self.rect(), self.bg_pixmap)
super().paintEvent(event)
def update_weight(self, weight_data):
"""根据TCP获取的数据更新重量显示"""
# 更新6个数字标签补零为6位超过6位取后6位
try:
weight_int = int(weight_data)
weight_str = f"{weight_int:06d}"[-6:]
except (ValueError, TypeError):
weight_str = "000000"
for i in range(min(len(self.digit_labels), 6)):
self.digit_labels[i].setText(weight_str[i] if i < len(weight_str) else "0")
def _update_status_icon(self, is_connected):
"""根据连接状态切换图标"""
if not self.check_label:
return
icon_path = self.connected_icon_path if is_connected else self.default_icon_path
pixmap = QPixmap(icon_path)
if not pixmap.isNull():
self.check_label.setPixmap(pixmap.scaled(
pixmap.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation))
else:
print(f"错误:{icon_path} 加载失败,请检查路径!")
# --------------------
# 清空界面信息的通用方法
# --------------------
def _clear_ui_info(self):
"""清空管片ID和网格信息"""
if self.id_value_label:
self.id_value_label.setText("")
for widget in self.statusWidgets:
widget['valueLabel'].setText("")
print(" 界面信息已清空")
# 测试代码
if __name__ == "__main__":
app = QApplication(sys.argv)
dialog = WeightDetailsDialog()
dialog.show()
sys.exit(app.exec())