from PySide6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QMessageBox, QApplication) 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大小与背景图一致 self.bg_pixmap = QPixmap(ImagePaths.TASK_INFO_BACKGROUND1) self.setFixedSize(self.bg_pixmap.size()) # 主布局(垂直) self.main_layout = QVBoxLayout(self) self.main_layout.setContentsMargins(0, 0, 0, 6) self.main_layout.setSpacing(0) # 任务标题 title_label = QLabel(taskTitle, self) title_label.setStyleSheet("font-size: 24px; color: #16ffff;padding-top:4px;") title_label.setAlignment(Qt.AlignCenter) self.main_layout.addWidget(title_label, alignment=Qt.AlignTop) # 标题字体设置 # title_font = title_label.font() title_font = QFont("Microsoft YaHei") title_font.setLetterSpacing(QFont.AbsoluteSpacing, 3) # 字间距3px title_font.setWeight(QFont.DemiBold) title_label.setFont(title_font) # 用字典存储每个任务的可修改控件(键:任务名,值:控件字典) self.task_controls = {} # 结构:{"task1": {"volume_label": xxx, "time_label": xxx, ...}, ...} # 三条任务条目 self._add_task("task1", "SHRB1-3", ImagePaths.TASK_RECT1) self._add_task("task2", "SHRB2-3", ImagePaths.TASK_RECT2) self._add_task("task3", "SHRB1-3", ImagePaths.TASK_RECT3) def paintEvent(self, event): """绘制背景图片""" painter = QPainter(self) painter.drawPixmap(self.rect(), self.bg_pixmap) super().paintEvent(event) def _add_task(self, task_name, task_id, status_icon): "添加相应的任务条目到布局,同时将其相应的控件存入字典" # 1、创建任务条目,以及相应的控件字典 item_widget, controls = self._create_task_item(task_name, task_id, status_icon) # 2、将控件字典存入 相应的 任务条目字典 self.task_controls[task_name] = controls # 3、将任务条目添加到主布局 self.main_layout.addWidget(item_widget, alignment=Qt.AlignTop) def _create_task_item(self, task_name, task_id, status_icon): """创建单条任务条目, 返回任务条目和控件字典""" item_widget = QWidget() item_layout = QVBoxLayout(item_widget) item_layout.setContentsMargins(9, 6, 9, 8) item_layout.setSpacing(0) # 相应的 任务条目的控件字典 controls = {} # {"volume_label": ..., "time_label": ..., ...} # 水平布局1:选择按钮 + 任务名 + 详情按钮 row1_layout = QHBoxLayout() # 任务选择按钮 select_btn = QPushButton() select_btn.setFixedSize(14, 14) select_btn.setCursor(Qt.PointingHandCursor) select_btn.setStyleSheet(f""" QPushButton {{ background-image: url({ImagePaths.TASK_INFO_SELECT_BTN1}); border: none; }} QPushButton:checked {{ background-image: url({ImagePaths.TASK_INFO_SELECT_BTN2}); }} """) select_btn.setCheckable(True) controls["select_btn"] = select_btn row1_layout.addWidget(select_btn) # 任务编号 task_id_label = QLabel(task_id) task_id_label.setStyleSheet("font-size: 18px; color: #16ffff;padding-left: 6px;") controls["task_id_label"] = task_id_label row1_layout.addWidget(task_id_label) # 详情按钮 detail_btn = QPushButton() detail_btn.setText("详情") detail_btn.setFixedSize(46, 26) detail_btn.setCursor(Qt.PointingHandCursor) detail_btn.setStyleSheet(f""" QPushButton {{ background-image: url({ImagePaths.TASK_INFO_DETAIL_BTN1}); border: none; color: #3bfff8; font-size: 16px; }} QPushButton:hover {{ background-image: url({ImagePaths.TASK_INFO_DETAIL_BTN2}); color: #001c83; font-size: 16px; }} """) detail_btn.clicked.connect(lambda: self._show_detail_dialog(task_name)) # 详情按钮槽函数 controls["detail_btn"] = detail_btn row1_layout.addWidget(detail_btn) item_layout.addLayout(row1_layout) # 水平布局2:方量 + / + 时间 + 状态图标 row2_layout = QHBoxLayout() # 方量标签 volume_label = QLabel("方量 200") volume_label.setStyleSheet("color: #a1c1d7; font-size: 14px;padding-left: 19px;") controls["volume_label"] = volume_label row2_layout.addWidget(volume_label) # 分隔标签 sep_label = QLabel("/") sep_label.setStyleSheet("color: #a1c1d7;") row2_layout.addWidget(sep_label, alignment=Qt.AlignCenter) # 时间标签 time_label = QLabel("03:22PM") time_label.setStyleSheet("color: #a1c1d7; font-size: 14px;") controls["time_label"] = time_label row2_layout.addWidget(time_label) # 状态标签 status_icon_label = QLabel() status_icon_label.setPixmap(QPixmap(status_icon)) controls["status_icon_label"] = status_icon_label row2_layout.addWidget(status_icon_label, alignment=Qt.AlignRight) item_layout.addLayout(row2_layout) # 分隔线 item_layout.setSpacing(5) separator = QLabel() separator.setPixmap(QPixmap(ImagePaths.TASK_INFO_SEPARATOR)) separator.setFixedSize(196, 1) item_layout.addWidget(separator) return item_widget, controls # 返回任务条目 以及 相应的控件 def _show_detail_dialog(self, task_name): """显示任务详情弹窗""" # QMessageBox.information(self, "任务详情", f"任务 {task_name} 的详细信息...") """ task1 表示第一条任务, 依次类推 """ # 发送任务详情信号 self.task_details_signal.emit(task_name) # -------------------------- # 对外接口:修改任务属性 # 三个任务条目对应的任务名task_name,分别为 task1、task2、task3 # -------------------------- def set_task_volume(self, task_name:str, volume: float): """修改指定任务的方量, 传入具体的方量值,如: 200.0""" if task_name in self.task_controls: volume_label = self.task_controls[task_name]["volume_label"] volume_label.setText(f"方量 {volume}") def set_task_time(self, task_name:str, time_str: str): """修改指定任务的时间, 传入对应格式的时间,如: 03:22PM""" if task_name in self.task_controls: time_label = self.task_controls[task_name]["time_label"] time_label.setText(time_str) def set_task_id(self, task_name:str, new_id: str): """修改指定任务的编号, 如: SHRB2-3""" if task_name in self.task_controls: task_id_label = self.task_controls[task_name]["task_id_label"] task_id_label.setText(new_id) def get_task_volume(self, task_name:str): """ 获取指定任务的方量, 传入任务名,如 task1、task2、task3 return: 返回 float类型一位小数的方量值 """ if task_name in self.task_controls: volume_label = self.task_controls[task_name]["volume_label"] # 提取 volume_label中显示的 "方量 200" 中的数字部分 # 1. 去除前后空格,按空格分割字符串 volume_text = volume_label.text().strip() parts = volume_text.split() # 2. 取分割后的数字部分 if len(parts) >= 2: number_str = parts[1] # 得到 "200" else: # 格式异常(没有数字部分),返回None return None # 褚工说任务中显示的方量只有一位小数 try: volume_value = round(float(number_str), 1) return volume_value except ValueError: return None if __name__ == "__main__": app = QApplication(sys.argv) widget = TaskWidget("管片任务") # 示例:修改task2的方量为300(测试用) widget.set_task_volume("task2", 300) # 示例:修改task1的时间为04:50PM(测试用) widget.set_task_time("task1", "04:50PM") widget.show() sys.exit(app.exec())