Files
Feeding_control_system/view/widgets/segment_details_dialog.py

315 lines
11 KiB
Python
Raw Normal View History

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
import sys
from utils.image_paths import ImagePaths
"""
管片任务详情的弹出窗口: 点击管片任务的详情按钮之后弹出
"""
class SegmentDetailsDialog(QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.setAttribute(Qt.WA_TranslucentBackground)
# 初始化存储需要修改的控件
self.id_value_label = None # 管片ID值标签
self.left_cells = [] # 左列单元格列表每个元素是包含label和value的widget
self.right_cells = [] # 右列单元格列表
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区域保存ID值标签引用
self._add_segment_id_area(main_layout)
# 3. 网格信息区域(保存左右列单元格引用)
self._add_grid_info_area(main_layout)
def _load_background(self):
self.bg_pixmap = QPixmap(ImagePaths.SEGMENT_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) # 保持原标题下方36px间距
top_layout.setSpacing(0)
# 左侧弹簧(让标题居中)
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):
"""创建36x36关闭按钮"""
self.close_btn = QPushButton()
self.close_btn.setFixedSize(36, 36) # 固定尺寸18x18
# 加载关闭图标
close_icon = QPixmap(ImagePaths.SEGMENT_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标签
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.SEGMENT_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)
# 右侧管片ID值保存引用到实例变量
self.id_value_label = QLabel("346482967298119")
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)
# 初始化显示的数据
# 左侧信息条目
left_info_items = [
("管片编号", "QR1B32000153AD"),
("管片副标识", "QR1B32000153AD"),
("生产环号", "QR1B32000153AD"),
("模具编号", "QR1B32000153AD"),
("骨架编号", "QR1B32000153AD"),
("环类型编号", "QR1B32000153AD"),
("尺寸规格", "QR1B32000153AD"),
]
# 右侧信息条目
right_info_items = [
("分块号", "QR3143243423543254"),
("出洞环标记", "QR3143243423543254"),
("注浆管标记", "QR3143243423543254"),
("聚丙烯纤维标记", "QR3143243423543254"),
("浇筑方量", "QR3143243423543254"),
("任务单号", "QR3143243423543254"),
("埋深", "QR3143243423543254"),
]
# 填充左列并保存单元格引用
self.left_cells.clear() # 清空列表
for row, (label_text, value_text) in enumerate(left_info_items):
cell_widget = self._create_info_cell(label_text, value_text)
self.left_cells.append(cell_widget) # 保存到列表
grid_layout.addWidget(cell_widget, row, 0)
# 填充右列并保存单元格引用
self.right_cells.clear() # 清空列表
for row, (label_text, value_text) in enumerate(right_info_items):
cell_widget = self._create_info_cell(label_text, value_text)
self.right_cells.append(cell_widget) # 保存到列表
grid_layout.addWidget(cell_widget, row, 1)
parent_layout.addLayout(grid_layout)
def _create_info_cell(self, label_text, value_text):
cell_widget = QWidget()
cell_bg = QPixmap(ImagePaths.SEGMENT_DETAILS_INFO_BAR)
if not cell_bg.isNull():
cell_widget.setFixedSize(cell_bg.size())
cell_widget.setStyleSheet(f"""
background-image: url({ImagePaths.SEGMENT_DETAILS_INFO_BAR});
background-repeat: no-repeat;
background-position: Center;
""")
else:
print("警告:管片任务信息栏.png 加载失败,使用默认背景!")
cell_widget.setStyleSheet("background-color: #0a2463;")
cell_layout = QHBoxLayout(cell_widget)
cell_layout.setContentsMargins(2, 0, 0, 0)
# 左侧标签保存到cell_widget的属性中
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; background-color: #1369b4; color: #fffffd; font-weight:Bold;")
label.setAlignment(Qt.AlignCenter)
cell_widget.label = label
# 右侧值保存到cell_widget的属性中
value = QLabel(value_text)
value_font = QFont()
value_font.setPixelSize(18)
value.setFont(value_font)
value.setStyleSheet("background: none; color: #9fbfd4;")
value.setAlignment(Qt.AlignVCenter | Qt.AlignLeft)
cell_widget.value = value
cell_layout.addWidget(label)
cell_layout.addSpacing(60)
cell_layout.addWidget(value)
return cell_widget
def paintEvent(self, event):
if not self.bg_pixmap.isNull():
painter = QPainter(self)
painter.drawPixmap(self.rect(), self.bg_pixmap)
super().paintEvent(event)
# ------------------- 对外修改接口 -------------------
# --------------修改管片任务详情中显示的值 ------------
def set_segment_id(self, new_id):
"""修改管片ID的值"""
if self.id_value_label:
self.id_value_label.setText(str(new_id))
def set_left_label(self, row, new_label_text:str):
"""
修改左列网格的标签文本 ("生产环号")
Args:
row: 左列网格行号(0-6,共7行)
new_label_text: 新的标签文字管片编号
"""
if 0 <= row < len(self.left_cells):
cell = self.left_cells[row]
cell.label.setText(str(new_label_text) if new_label_text else "")
def set_left_value(self, row, new_value_text:str):
"""
修改左列网格的值
Args:
row: 左列网格行号(0-6,共7行)
new_value_text: 新的值(FB789)
"""
if 0 <= row < len(self.left_cells):
cell = self.left_cells[row]
cell.value.setText(str(new_value_text) if new_value_text else "")
def set_right_label(self, row, new_label_text:str):
"""
修改右列网格的标签文本 ("任务单号")
Args:
row: 右列网格行号(0-6,共7行)
new_label_text: 新的标签文字分块号
"""
if 0 <= row < len(self.right_cells):
cell = self.right_cells[row]
cell.label.setText(str(new_label_text) if new_label_text else "")
def set_right_value(self, row, new_value_text:str):
"""
修改右列网格的值
Args:
row: 右列网格行号(0-6,共7行)
new_value_text: 新的值(FB789)
"""
if 0 <= row < len(self.left_cells):
cell = self.right_cells[row]
cell.value.setText(str(new_value_text) if new_value_text else "")
# 测试代码
if __name__ == "__main__":
app = QApplication(sys.argv)
dialog = SegmentDetailsDialog()
dialog.show()
# 测试修改接口
dialog.set_segment_id("999999999999999") # 修改管片ID值
# 左列修改
dialog.set_left_label(0, "新管片编号") # 修改左列第0行的标签文本
dialog.set_left_value(0, "QR6666666666666") # 修改左列第0行的值
# 右列修改
dialog.set_right_label(0, "新分块号") # 修改右列第0行的标签文本
dialog.set_right_value(0, "QR99999999999999999") # 修改右列第0行的值
sys.exit(app.exec())