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(new_label_text) 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(new_value_text) 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(new_label_text) 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(new_value_text) # 测试代码 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())