增加了 派单任务详情弹窗

This commit is contained in:
2025-11-08 18:25:16 +08:00
parent 52d753267b
commit aa7dd7974a
7 changed files with 489 additions and 10 deletions

View File

@ -0,0 +1,391 @@
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())