Files
Feeding_control_system/view/widgets/dispatch_details_dialog.py

392 lines
14 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 (
QApplication,
QDialog,
QVBoxLayout,
QHBoxLayout,
QGridLayout,
QLabel,
QWidget,
QPushButton,
)
from PySide6.QtGui import QPixmap, QFont, QPainter, QIcon
from PySide6.QtCore import Qt, QEvent, Signal
import sys
from utils.image_paths import ImagePaths
from view.widgets.value_adjuster import ValueAdjuster
"""
派单任务的详情按钮点击之后弹出, 显示派单任务的详情
"""
class DispatchDetailsDialog(QDialog):
# 确认修改了派单任务的方量,发送任务名(task1、task2等)和最终确认修改的方量值
confirm_modify_volume = Signal(str, float)
def __init__(self, dispatch_task_name:str, parent=None):
super().__init__(parent)
self.setAttribute(Qt.WA_TranslucentBackground)
# 派单任务名 (task1、task2、 task3)
self.dispatch_task_name = dispatch_task_name
# 初始化存储需要修改的控件
self.id_value_label = None # 对应管片ID值标签
self.rows = [] # 所有行的单元格列表包含label、value
# 派单方量调整控件,用于修改派单方量
self.volume_value_adjuster = None
self._init_ui()
def _init_ui(self):
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)
# 2. 对应管片ID区域
self._add_segment_id_area(main_layout)
# 3. 网格信息区域单列7行
self._add_grid_info_area(main_layout)
# 4. 修改方量按钮
self.modify_btn = QPushButton("修改方量", parent=self)
self.modify_btn.setFixedSize(89, 32)
self.modify_btn.setStyleSheet(
"""
QPushButton {
background-color: #001c82;
color: #9fbfd4;
border: 1px solid #017cbc;
font-size: 18px;
font-weight: Bold;
}
QPushButton:hover {
color: #2dcedb;
}
"""
)
# modify_btn.move(860, 446) # 移动到第五行,派单方量的位置
self.modify_btn.move(860, 442) # 移动到第五行,派单方量的位置
self.modify_btn.clicked.connect(self.onModifyVolume)
# 确认修改方量按钮,表示 派单方量的修改已经确定
self.confirm_btn = QPushButton("确定", parent=self)
self.confirm_btn.setStyleSheet(
"""
QPushButton {
background-color: #001c82;
color: #9fbfd4;
border: 1px solid #017cbc;
font-size: 18px;
font-weight: Bold;
}
QPushButton:hover {
color: #2dcedb;
}
"""
)
self.confirm_btn.move(860, 442)
self.confirm_btn.hide() # 初始隐藏
self.confirm_btn.setFixedSize(42, 32)
self.confirm_btn.clicked.connect(self.onConfirmModifyVolume)
# 取消修改方量按钮,表示 派单方量的修改已经取消
self.cancel_btn = QPushButton("取消", parent=self)
self.cancel_btn.setStyleSheet(
"""
QPushButton {
background-color: #001c82;
color: #9fbfd4;
border: 1px solid #017cbc;
font-size: 18px;
font-weight: Bold;
}
QPushButton:hover {
color: #2dcedb;
}
"""
)
self.cancel_btn.hide()
self.cancel_btn.setFixedSize(42, 32)
self.cancel_btn.move(907, 442)
self.cancel_btn.clicked.connect(self.onCancelModifyVolume)
def _load_background(self):
self.bg_pixmap = QPixmap(ImagePaths.DESPATCH_DETAILS_POPUP_BG)
if self.bg_pixmap.isNull():
print("错误:派单任务背景.png 加载失败,请检查路径!")
self.setFixedSize(800, 600)
else:
self.setFixedSize(self.bg_pixmap.size())
def _add_top_area(self, parent_layout):
top_layout = QHBoxLayout()
top_layout.setContentsMargins(0, 0, 0, 36)
top_layout.addStretch()
# 标题改为“任务派单”
title_label = QLabel("派单任务")
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)
# 关闭按钮(保持原逻辑)
self._create_close_button(top_layout)
parent_layout.addLayout(top_layout)
def _create_close_button(self, parent_layout):
self.close_btn = QPushButton()
self.close_btn.setFixedSize(36, 36)
close_icon = QPixmap(ImagePaths.DESPATCH_DETAILS_CLOSE_ICON)
if not close_icon.isNull():
self.close_btn.setIcon(QIcon(close_icon))
self.close_btn.setStyleSheet(
"""
QPushButton {
background-color: transparent;
border: none;
padding: 0px;
}
QPushButton:hover {
background-color: red;
border-radius: 2px;
}
"""
)
self.close_btn.clicked.connect(self.close)
parent_layout.addStretch()
parent_layout.addWidget(self.close_btn)
def _add_segment_id_area(self, parent_layout):
id_layout = QHBoxLayout()
id_label = QLabel("对应管片ID") # 标签文字修改
id_label.setFixedSize(318, 32)
id_font = QFont()
id_font.setPixelSize(18)
id_font.setLetterSpacing(QFont.AbsoluteSpacing, 2)
id_font.setBold(True)
id_label.setFont(id_font)
id_label.setStyleSheet(
f"""
background-image: url({ImagePaths.DESPATCH_DETAILS_TITLE_BG});
background-repeat: no-repeat;
background-position: center;
color: #13ffff;
"""
)
id_label.setContentsMargins(16, 0, 0, 0)
id_label.setAlignment(Qt.AlignLeft | Qt.AlignVCenter)
self.id_value_label = QLabel("222232454352452") # 初始管片ID值
value_font = QFont()
value_font.setPixelSize(18)
value_font.setBold(True)
value_font.setLetterSpacing(QFont.AbsoluteSpacing, 2)
self.id_value_label.setFont(value_font)
self.id_value_label.setStyleSheet("color: #13ffff;")
self.id_value_label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
id_layout.addWidget(id_label)
id_layout.addStretch()
id_layout.addWidget(self.id_value_label)
id_layout.setContentsMargins(0, 0, 0, 16)
parent_layout.addLayout(id_layout)
def _add_grid_info_area(self, parent_layout):
grid_layout = QGridLayout()
grid_layout.setSpacing(12)
# 初始化信息条目7行
info_items = [
("创建时间", "2025年10月10日 10:10:10"),
("派单时间", "2025年10月10日 10:10:10"),
("任务编号", "20251010-10"),
("配比编号", "20251010-10"),
("派单方量", "2.0"),
("派单状态", "未下发"),
("派单类型", "自动派单"),
]
self.rows.clear()
for row, (label_text, value_text) in enumerate(info_items):
cell_widget = self._create_info_cell(label_text, value_text)
self.rows.append(cell_widget)
grid_layout.addWidget(cell_widget, row, 0)
parent_layout.addLayout(grid_layout)
def _create_info_cell(self, label_text, value_text):
cell_widget = QWidget()
cell_bg = QPixmap(ImagePaths.DESPATCH_DETAILS_INFO_BAR_NORMAL) # 正常背景图
cell_widget.setObjectName("infoCell")
if not cell_bg.isNull():
cell_widget.setFixedSize(cell_bg.size())
cell_widget.setStyleSheet(
f"""
QWidget {{
background-image: url({ImagePaths.DESPATCH_DETAILS_INFO_BAR_NORMAL});
background-repeat: no-repeat;
background-position: Center;
}}
QWidget:hover {{
background-image: url({ImagePaths.DESPATCH_DETAILS_INFO_BAR_HOVER});
}}
QWidget QLabel#valueLabel {{
color: #9fbfd4;
background: none;
}}
"""
)
cell_layout = QHBoxLayout(cell_widget)
cell_layout.setContentsMargins(0, 0, 0, 0)
# 左侧标签
label = QLabel(label_text)
label.setFixedSize(136, 60)
label_font = QFont()
label_font.setPixelSize(16)
label_font.setLetterSpacing(QFont.AbsoluteSpacing, 2)
label.setFont(label_font)
label.setStyleSheet("background: none;color: #fffffd; font-weight:Bold;")
label.setAlignment(Qt.AlignCenter)
cell_widget.label = label
# 右侧值标签设置objectName以便样式选择
value = QLabel(value_text)
value.setObjectName("valueLabel")
value_font = QFont()
value_font.setPixelSize(20)
value.setFont(value_font)
value.setAlignment(Qt.AlignCenter)
cell_widget.value = value
cell_layout.addWidget(label) # 左侧的标题标签
cell_layout.addSpacing(60)
cell_layout.addWidget(value) # 右侧的值标签
cell_widget.installEventFilter(self)
return cell_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 onModifyVolume(self):
"""修改派单方量的逻辑"""
volume_label = self.rows[4].value
current_value = float(volume_label.text())
# 1、调整派单方量创建派单方量调整控件
if not self.volume_value_adjuster:
self.volume_value_adjuster = ValueAdjuster(self)
self.volume_value_adjuster.move(551, 442) # 移动到当前显示派单方量的标签处
# 2、更新派单方量调整控件的值, 并显示
self.volume_value_adjuster.set_value(current_value)
self.volume_value_adjuster.show()
# 3、显示确定按钮、显示取消按钮、隐藏修改方量按钮
self.confirm_btn.show()
self.cancel_btn.show()
self.modify_btn.hide()
def onConfirmModifyVolume(self):
"""确定 修改派单方量"""
# 显示相关的:
# 1、隐藏确认按钮、隐藏取消按钮、显示修改方量按钮
self.confirm_btn.hide()
self.cancel_btn.hide()
self.modify_btn.show()
# 2、修改 派单方量标签的值
volume_label = self.rows[4].value
# modifyed_value 为float类型, 一位小数
modifyed_value = self.volume_value_adjuster.get_value()
volume_label.setText(str(modifyed_value))
# 3、发送派单方量确定修改的信号 (发送派单任务名 + 确认修改之后的派单方量)
self.confirm_modify_volume.emit(self.dispatch_task_name, modifyed_value)
# 4、关闭派单方量调整控件
self.volume_value_adjuster.close()
def onCancelModifyVolume(self):
# 显示相关的:
# 1、隐藏确认按钮、隐藏取消按钮、显示修改方量按钮
self.confirm_btn.hide()
self.cancel_btn.hide()
self.modify_btn.show()
# 2、关闭派单方量调整控件
self.volume_value_adjuster.close()
def paintEvent(self, event):
if not self.bg_pixmap.isNull():
painter = QPainter(self)
painter.drawPixmap(self.rect(), self.bg_pixmap)
super().paintEvent(event)
# ------------------- 对外修改接口 -------------------
# row 对应行号(0-6)从0开始
# --------------------------------------------------
def set_segment_id(self, new_id):
"""修改上方的 对应的管片ID的值"""
if self.id_value_label:
self.id_value_label.setText(str(new_id))
def set_row_label(self, row, new_label_text: str):
"""修改左侧的显示的标签的文本,如: 创建时间、派单时间等"""
if 0 <= row < len(self.rows):
self.rows[row].label.setText(new_label_text)
def set_row_value(self, row, new_value_text: str):
"""修改右侧的显示的值, 如: 2025年9月9日 9:9:9"""
if 0 <= row < len(self.rows):
self.rows[row].value.setText(new_value_text)
# 测试代码
if __name__ == "__main__":
app = QApplication(sys.argv)
dialog = DispatchDetailsDialog()
# 测试修改接口
dialog.set_segment_id("999999999999999")
dialog.set_row_label(0, "新创建时间")
dialog.set_row_value(0, "2025年09月09日 09:09:09")
dialog.set_row_value(4, "3.0") # 初始派单方量修改
dialog.show()
sys.exit(app.exec())