From 52d753267bafa5f8b606d61bb9e5600060d0318a Mon Sep 17 00:00:00 2001 From: yanganjie Date: Fri, 7 Nov 2025 21:58:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=20=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E8=AF=8A=E6=96=AD=E5=BC=B9=E7=AA=97=E4=BB=A5=E5=8F=8A?= =?UTF-8?q?=20=E7=AE=A1=E7=89=87=E4=BB=BB=E5=8A=A1=E7=9A=84=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E6=8C=89=E9=92=AE=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- images/关闭图标.png | Bin 0 -> 229 bytes images/管片任务信息栏.png | Bin 0 -> 369 bytes images/详情弹出背景.png | Bin 0 -> 19062 bytes images/详情标题.png | Bin 0 -> 1075 bytes utils/image_paths.py | 8 +- view/main_window.py | 30 ++- view/widgets/segment_details_dialog.py | 315 ++++++++++++++++++++++ view/widgets/system_diagnostics_dialog.py | 10 +- view/widgets/task_widget.py | 17 +- 9 files changed, 365 insertions(+), 15 deletions(-) create mode 100644 images/关闭图标.png create mode 100644 images/管片任务信息栏.png create mode 100644 images/详情弹出背景.png create mode 100644 images/详情标题.png create mode 100644 view/widgets/segment_details_dialog.py diff --git a/images/关闭图标.png b/images/关闭图标.png new file mode 100644 index 0000000000000000000000000000000000000000..9b090d67965bc9643f057743a444b62ec207dee1 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@RheHJ&bxAr`$;uWaOEGURD^sBq{Z z_s+SGe;WAh`n_rUofS>H{t3N3xYBpBh?R+_Jr}Rw1D-n#auc4&HE0)HI^24Gm%5>= z+|zeU8e<(j61r?o%hp~j^Gn%a@ACL`6Gxb9og%;SM5&ZS-y=;~5yF{{L2*XOzAoRr z-fR{8d1}4u664j)@o%=dZSk+-=l)8VEO%v@oj9)U!c1gJYD@<);T3K0RY{-S^oe4 literal 0 HcmV?d00001 diff --git a/images/管片任务信息栏.png b/images/管片任务信息栏.png new file mode 100644 index 0000000000000000000000000000000000000000..290f6ab9053d406bd3e7b3bd3fdf9f9f21ac0cd1 GIT binary patch literal 369 zcmeAS@N?(olHy`uVBq!ia0y~yV7vfiJ8`f9$>%NYe}DoOo-U3d6?5KRHRL_SAmVy4 zzKKOAi9yk{nOBGI)bII5Zeon79}k8<-pvhAsE>n%nOz7%URg>V9!@<*%Ca=>RY&89ZJ6T-G@y GGywnulvREJ literal 0 HcmV?d00001 diff --git a/images/详情弹出背景.png b/images/详情弹出背景.png new file mode 100644 index 0000000000000000000000000000000000000000..7c003c296102c6b712a95145c0c41a34fd28cfd3 GIT binary patch literal 19062 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 literal 0 HcmV?d00001 diff --git a/utils/image_paths.py b/utils/image_paths.py index ffdda75..a62027b 100644 --- a/utils/image_paths.py +++ b/utils/image_paths.py @@ -101,4 +101,10 @@ class ImagePaths: SYSTEM_DIAGNOSTICS_STATUS_YELLOW = "images/系统诊断状态黄.png" SYSTEM_DIAGNOSTICS_STATUS_RED = "images/系统诊断状态红.png" SYSTEM_DIAGNOSTICS_MS_BG = "images/系统诊断毫秒背景.png" - SYSTEM_DIAGNOSTICS_DROPDOWN_ARROW = "images/系统诊断下拉箭头.png" \ No newline at end of file + SYSTEM_DIAGNOSTICS_DROPDOWN_ARROW = "images/系统诊断下拉箭头.png" + + # 功能:管片任务详情按钮弹窗 + SEGMENT_DETAILS_POPUP_BG = "images/详情弹出背景.png" + SEGMENT_DETAILS_TITLE_BG = "images/详情标题.png" + SEGMENT_DETAILS_INFO_BAR = "images/管片任务信息栏.png" + SEGMENT_DETAILS_CLOSE_ICON = "images/关闭图标.png" \ No newline at end of file diff --git a/view/main_window.py b/view/main_window.py index cb91984..e2a500a 100644 --- a/view/main_window.py +++ b/view/main_window.py @@ -21,6 +21,8 @@ from .widgets.bottom_control_widget import BottomControlWidget import resources.resources_rc from utils.image_paths import ImagePaths +from .widgets.segment_details_dialog import SegmentDetailsDialog + class MainWindow(QWidget): def __init__(self): @@ -34,21 +36,27 @@ class MainWindow(QWidget): # 安装事件过滤器,处理计划方量的 QLineEdit的失去焦点事件 self.installEventFilter(self) + # 连接槽函数 def connectSignalToSlot(self): # 可添加信号槽连接 # self.system_button_widget.buttons["系统启动"].clicked.connect(self.handleSystemStart) # self.system_button_widget.buttons["系统停止"].clicked.connect(self.handleSystemStop) - pass - self.conveyor_system_widget.left_btn.clicked.connect(self.handleHopperMoveLeft) - self.conveyor_system_widget.right_btn.clicked.connect(self.handleHopperMoveRight) + + # 传送带部分的按钮 + self.conveyor_system_widget.left_btn.clicked.connect(self.handleHopperMoveLeft) # 传送带下的左移按钮 + self.conveyor_system_widget.right_btn.clicked.connect(self.handleHopperMoveRight) # 传送带下的右移按钮 + + # 管片任务详情 + self.segment_task_widget.task_details_signal.connect(self.handleSegmentTaskDetails) # 管片任务详情按钮 + def handleSystemStart(self): - # 测试 + # 测试系统开启,进度条动画 self.production_progress.testProgress(60) self.arc_progress.testProgress(60) def handleSystemStop(self): - # 测试 + # 测试系统停止,进度条动画 self.production_progress.animation.stop() self.arc_progress.animation.stop() @@ -101,6 +109,7 @@ class MainWindow(QWidget): self.dispatch_task_widget.set_task_id("task2", "PD0002") self.dispatch_task_widget.set_task_id("task3", "PD0003") + # 读取数据库,初始化 管片任务的数据 from busisness.blls import ArtifactBll, PDRecordBll artifact_dal = ArtifactBll() artifacts = artifact_dal.get_artifact_task() @@ -221,6 +230,17 @@ class MainWindow(QWidget): # 料斗右移完成,恢复料斗左移按钮 QTimer.singleShot(2100, lambda: self.conveyor_system_widget.left_btn.setEnabled(True)) + def handleSegmentTaskDetails(self, segment_task_name:str): + # 管片任务名 task1、task2、task3 (分别对应第一条管片任务、 第二条管片任务...) + print("main_window: handleSegmentTaskDetails", segment_task_name) + + # 显示管片任务详情对话框 + segment_details_dialog = SegmentDetailsDialog(self) + # 这里可以设置对话框显示的内容 如 set_segment_id + # segment_details_dialog.set_segment_id("9999999999") + segment_details_dialog.show() + + # 更新 派单任务widget的坐标 def update_dispatch_task_position(self): # 方法1:获取模具车控件左上角坐标(相对于父控件) diff --git a/view/widgets/segment_details_dialog.py b/view/widgets/segment_details_dialog.py new file mode 100644 index 0000000..1a31784 --- /dev/null +++ b/view/widgets/segment_details_dialog.py @@ -0,0 +1,315 @@ +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()) \ No newline at end of file diff --git a/view/widgets/system_diagnostics_dialog.py b/view/widgets/system_diagnostics_dialog.py index 8c89c48..7295384 100644 --- a/view/widgets/system_diagnostics_dialog.py +++ b/view/widgets/system_diagnostics_dialog.py @@ -27,6 +27,10 @@ import sys from utils.image_paths import ImagePaths +""" + 系统诊断按钮的弹窗: 可以显示设备的状态 +""" + class CustomDropdown(QWidget): """自定义下拉框组件""" @@ -107,11 +111,7 @@ class CustomDropdown(QWidget): if self.is_expanded: self.list_widget.hide() # 箭头恢复向下 - self.arrow_label.setPixmap( - self.arrow_pixmap.scaled( - 12, 9, Qt.KeepAspectRatio, Qt.SmoothTransformation - ) - ) + self.arrow_label.setPixmap(self.arrow_pixmap) else: # 计算下拉框位置(在标签下方对齐) label_pos = self.result_label.mapToGlobal( diff --git a/view/widgets/task_widget.py b/view/widgets/task_widget.py index f3ca49e..e9f7556 100644 --- a/view/widgets/task_widget.py +++ b/view/widgets/task_widget.py @@ -1,14 +1,19 @@ from PySide6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QMessageBox, QApplication) -from PySide6.QtCore import Qt +from PySide6.QtCore import Qt, Signal from PySide6.QtGui import QPainter, QPixmap, QFont import sys import resources.resources_rc from utils.image_paths import ImagePaths -# 任务控件,如:管片任务、派单任务 +""" + 任务控件,如:管片任务、派单任务 +""" class TaskWidget(QWidget): + # 任务详情信号: task1表示第一条任务 + task_details_signal = Signal(str) + def __init__(self, taskTitle:str, parent=None): super().__init__(parent) # 设置Widget大小与背景图一致 @@ -153,8 +158,12 @@ class TaskWidget(QWidget): def _show_detail_dialog(self, task_name): """显示任务详情弹窗""" - QMessageBox.information(self, "任务详情", f"任务 {task_name} 的详细信息...") - + # QMessageBox.information(self, "任务详情", f"任务 {task_name} 的详细信息...") + """ + task1 表示第一条任务, 依次类推 + """ + # 发送任务详情信号 + self.task_details_signal.emit(task_name) # -------------------------- # 对外接口:修改任务属性