import json import base64 import os from PyQt6 import * from PyQt6.QtCore import * from PyQt6.QtGui import * from PyQt6.QtWidgets import * from ui.Ui_projectForm import Ui_projectForm from projectModel.projectManager import projectManager from insertProTaskDlg import InsertProTaskDlg from userModel.userManager import userManager from taskModel.taskManager import taskManager from createProjectDlg import CreateProjectDlg from instructionModel.instructionManager import instructionManager from taskModel.taskActuatorManager import taskActuatorManager from deviceModel.deviceManager import deviceManager from devmodelModel.devModelManager import devModelManager from taskInstructionModel.taskInstructionManager import taskInstructionManager from taskModel.taskActuatorManager import taskActuatorManager from config import config from common import common from common import NoWheelComboBox from common import TaskProgressBar from common import AlignDelegate from logs import log from influxDB import influxdb class QxStandardItem(QStandardItem): def __init__(self, text=''): super().__init__(text) def updateProgress(self, taskId, value, maxValue): obj = self.data(Qt.ItemDataRole.UserRole) if obj is not None and isinstance(obj, dict): if str(taskId) == str(obj.get('task_instruction_id')): self.setData({'value': value, 'maximum': maxValue, 'task_instruction_id': obj.get('task_instruction_id'), 'name':obj.get('name')}, Qt.ItemDataRole.UserRole) class ProgressBarDelegate(QStyledItemDelegate): def paint(self, painter, option, index): if index.column() == 5: # 仅对第二列添加进度条 data = index.data(Qt.ItemDataRole.UserRole) # 获取进度条数据 if data is not None and isinstance(data, dict): value = data.get('value', -9999) maximum = data.get('maximum', -9999) progress_rect = option.rect # 进度条的矩形边界 progress_width = int((value / maximum) * progress_rect.width()) # 计算进度条的宽度 progress_rect.adjust(2, 2, -2, -2) # 绘制进度条背景 painter.fillRect(progress_rect, QColor("#F8FAFF")) # 绘制实际数值文本 text = f"{value}/{maximum}" text_rect = QRect(option.rect) # text_rect.adjust(0, 0, -1, 0) # 调整文本矩形边界 # 修改字体和颜色 # font = QFont("Arial", 10, QFont.Weight.Bold) # 创建字体对象 # painter.setFont(font) # 设置字体 pen = painter.pen() pen.setColor(Qt.GlobalColor.black) # 设置画笔颜色为红色 painter.setPen(pen) # 绘制实际进度 progress_rect.setWidth(progress_width) if value == -1 and maximum == -1: return if value >=0 and maximum >= 1 : painter.fillRect(progress_rect, QColor("#007EFF")) painter.drawText(text_rect, Qt.AlignmentFlag.AlignCenter, text) else: super().paint(painter, option, index) class ProjectForm(QWidget): TASK = 0 VIRTUAL = 1 INSTRUCTION = 2 def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_projectForm() self.ui.setupUi(self) self.settings = QSettings("OCE", "PlatFormPlus") self.currentProjectIndex = self.settings.value("currentProjectIndex", defaultValue=0) self.targetIds = [] self.taskModelBlockSignals = False self.targetParams = {} self.topWidget = None self.supportedTypes = instructionManager.getSupportedType() self.createProjectDlg = CreateProjectDlg() self.insertTaskDlg = InsertProTaskDlg() self.insertTaskDlg.accepted.connect(self.refreshTask) self.taskModel = QStandardItemModel() self.ui.tableViewTask.setModel(self.taskModel) self.taskDetailModel = QStandardItemModel() self.ui.tableViewTaskDetail.setModel(self.taskDetailModel) self.taskModel.itemChanged.connect(self.taskChanged) userManager.loginSignal.connect(self.loadProject) self.ui.pbAdd.clicked.connect(self.addProject) self.ui.pbDelete.clicked.connect(self.deleteProject) self.ui.pbEdit.clicked.connect(self.editProject) self.basePath = config.data["project"]["base_path"] self.createProjectDlg.createFinished.connect(self.createProFinished) self.createProjectDlg.editFinished.connect(self.editProFinished) self.projectModel = QStandardItemModel() self.propertyModel = QStandardItemModel() self.proHistoryModel = QStandardItemModel() self.fileSystemModel = QFileSystemModel() self.ui.tableViewPro.setModel(self.projectModel) self.ui.tableViewProperty.setModel(self.propertyModel) self.ui.tableViewHistory.setModel(self.proHistoryModel) self.fileSystemModel.setRootPath(self.basePath) self.ui.pbInserTask.clicked.connect(self.insertTask) self.ui.pbDeleteTask.clicked.connect(self.deleteTask) self.ui.pbStartTask.clicked.connect(self.startTask) self.ui.pbStopTask.clicked.connect(self.stopTask) self.ui.pbAddProperty.clicked.connect(self.addProperty) self.ui.pbDeleteProperty.clicked.connect(self.deleteProperty) self.propertyModel.itemChanged.connect(self.updateProperty) self.ui.tableViewPro.selectionModel().selectionChanged.connect(self.handleProSelection) self.ui.tableViewTask.selectionModel().selectionChanged.connect(self.handleTaskSelection) self.ui.treeViewFile.setModel(self.fileSystemModel) self.ui.treeViewFile.doubleClicked.connect(self.handleFileOpen) self.batchSetItemDelegate() self.setSplitterStretchFactor() taskActuatorManager.updateProgress.connect(self._onUpdateProgress) # self.batchInstallEventFilter() def batchSetItemDelegate(self): self.ui.tableViewTask.horizontalHeader().setDefaultAlignment(Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter) self.ui.tableViewTaskDetail.horizontalHeader().setDefaultAlignment(Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter) self.ui.tableViewHistory.horizontalHeader().setDefaultAlignment(Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter) self.ui.tableViewPro.horizontalHeader().setDefaultAlignment(Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter) self.ui.tableViewProperty.horizontalHeader().setDefaultAlignment(Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter) self.ui.tableViewTask.setItemDelegate(AlignDelegate(self.ui.tableViewTask)) self.ui.tableViewTaskDetail.setItemDelegate(AlignDelegate(self.ui.tableViewTaskDetail)) self.ui.tableViewHistory.setItemDelegate(AlignDelegate(self.ui.tableViewHistory)) self.ui.tableViewProperty.setItemDelegate(AlignDelegate(self.ui.tableViewProperty)) self.ui.tableViewPro.setItemDelegate(AlignDelegate(self.ui.tableViewPro)) # def batchInstallEventFilter(self): # self.ui.w1.resizeEvent = self.onResize # self.ui.w2.resizeEvent = self.onResize # self.ui.w3.resizeEvent = self.onResize # def onResize(self, event): # self.setAllColumnWidth() def taskChanged(self): if self.taskModelBlockSignals == True: return # 遍历self.taskModel中的每一行,获取每一行的任务ID和参数,并存储到self.targetParams字典中 for row in range(self.taskModel.rowCount()): task_id_item = self.taskModel.item(row, 0) param_item = self.taskModel.item(row, 4) task_id = "" if task_id_item: task_id = task_id_item.text() param = "" if param_item: param = param_item.text() if task_id != "": self.targetParams[task_id] = param projectManager.saveProTask(self.targetIds, self.targetParams) def refreshTask(self): for target_id in self.insertTaskDlg.targetIds: if target_id not in self.targetIds: self.targetIds.append(target_id) self.targetParams[target_id] = "" projectManager.saveProTask(self.targetIds, self.targetParams) self.loadTask() def loadTask(self): self.taskModel.clear() self.taskDetailModel.clear() tasks = taskManager.getInfos(self.targetIds) self.taskModelBlockSignals = True if len(tasks) > 0: for task in tasks: index = self.taskModel.rowCount() task_id = str(task["id"]) param = "" if self.targetParams: param = task_id in self.targetParams and self.targetParams[task_id] or "" progressItem = QxStandardItem() progressItem.setData({'task_instruction_id': task["id"], 'name': task["name"]}, Qt.ItemDataRole.UserRole) self.taskModel.setItem(index, 0, QStandardItem(str(task["id"]))) self.taskModel.setItem(index, 1, QStandardItem(task["name"])) self.taskModel.setItem(index, 2, QStandardItem(str(task["loop"]))) self.taskModel.setItem(index, 3, QStandardItem(str(task["delay"]))) self.taskModel.setItem(index, 4, QStandardItem(param)) self.taskModel.setItem(index, 5, progressItem) self.taskModel.setItem(index, 6, QStandardItem(str(task["group_id"]))) self.setUnEditableStyle(self.taskModel.item(index, 1)) self.setUnEditableStyle(self.taskModel.item(index, 2)) self.setUnEditableStyle(self.taskModel.item(index, 3)) self.setUnEditableStyle(self.taskModel.item(index, 5)) delegate = ProgressBarDelegate() self.ui.tableViewTask.setItemDelegateForColumn(5, delegate) self.taskModelBlockSignals = False self.batchOperation() def _onUpdateProgress(self, taskId, value, maxValue): for row in range(self.taskModel.rowCount()): item = self.taskModel.item(row, 5) if item is not None: obj = item.data(Qt.ItemDataRole.UserRole) if obj is not None and isinstance(obj, dict): if str(taskId) == str(obj.get('task_instruction_id')): self.taskModelBlockSignals = True item.setData({'value': value, 'maximum': maxValue, 'task_instruction_id': obj.get('task_instruction_id'), 'name': obj.get('name')}, Qt.ItemDataRole.UserRole) self.taskModelBlockSignals = False return def insertTask(self): self.insertTaskDlg.showDlg() def deleteTask(self): if len(self.ui.tableViewTask.selectionModel().selectedRows())== 1: row = self.ui.tableViewTask.selectionModel().selectedRows()[0].row() row_taskId_index = self.taskModel.index(row, 0, QModelIndex()) row_taskName_index = self.taskModel.index(row, 1, QModelIndex()) taskid = self.taskModel.data(row_taskId_index, Qt.ItemDataRole.DisplayRole) taskName = self.taskModel.data(row_taskName_index, Qt.ItemDataRole.DisplayRole) if self.topWidget == None: self.topWidget = self.findTopLevelParent(self) if self.topWidget != None: if self.topWidget.removeDialog(taskName,"删除用例"): self.taskDetailModel.clear() self.taskModel.removeRow(row) self.targetIds.remove(taskid) self.targetParams.pop(taskid, None) projectManager.saveProTask(self.targetIds, self.targetParams) self.batchOperation() def startTask(self): for row in self.ui.tableViewTask.selectionModel().selectedRows(): row_index = self.taskModel.index(row.row(), 0, QModelIndex()) taskid = self.taskModel.data(row_index, Qt.ItemDataRole.DisplayRole) params = taskid in self.targetParams and self.targetParams[taskid] or None taskActuatorManager.start(taskid, params) def stopTask(self): for row in range(self.taskModel.rowCount()): task_id_item = self.taskModel.item(row, 0) taskid = task_id_item.text() taskActuatorManager.stop(taskid) #任务列表选中 def handleTaskSelection(self, index): if len(self.ui.tableViewTask.selectionModel().selectedRows()) == 1: self.refreshTaskDetail() def refreshTaskDetail(self): if len(self.ui.tableViewTask.selectionModel().selectedRows()) == 1: row = self.ui.tableViewTask.selectionModel().selectedRows()[0].row() row_index = self.taskModel.index(row, 0, QModelIndex()) taskid = self.taskModel.data(row_index, Qt.ItemDataRole.DisplayRole) self.loadTaskDetail(taskid) def setItemsEnable(self, enable): if not enable: self.ui.tableViewTask.setSelectionMode(QAbstractItemView.SelectionMode.NoSelection) else: self.ui.tableViewTask.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection) #加载任务详情 def loadTaskDetail(self, taskId): self.setItemsEnable(False) self.taskDetailModelBlockSignals = True self.taskDetailModel.clear() self.loadPageTaskDetail(taskId, 0, 50) self.taskDetailModelBlockSignals = False self.setItemsEnable(True) self.batchOperation() def loadPageTaskDetail(self, taskId, row, limit): QCoreApplication.processEvents() if taskId: taskInstructions = taskInstructionManager.getPageInfo(taskId,row, limit) if len(taskInstructions) > 0: for taskInstruction in taskInstructions: index = self.taskDetailModel.rowCount() self.taskDetailModel.setItem(index, 0, QStandardItem(str(taskInstruction["id"]))) self.taskDetailModel.setItem(index, 1, QStandardItem(str(taskInstruction["task_id"]))) name = "" type = "" devicename = "" dev_model_id = "" devinterface = [] if taskInstruction["target_type"] == "instruction": instruction = instructionManager.getInfo(str(taskInstruction["target_id"])) if instruction: name = instruction["name"] type = instruction["type"] if instruction["type"] is not None and instruction["type"] in self.supportedTypes: type = self.supportedTypes[instruction["type"]]["name"] device_id = taskInstruction["device_id"] device = deviceManager.getInfo(device_id) if device != None: devicename = device["name"] dev_model_id = device["dev_model_id"] devinterface = device["interface"] elif taskInstruction["target_type"] == "task": task = taskManager.getInfo(taskInstruction["target_id"]) if task != None: devicename = "任务" name = task["name"] self.taskDetailModel.setItem(index, 2, QStandardItem(devicename)) self.taskDetailModel.setItem(index, 3, QStandardItem(name)) self.taskDetailModel.setItem(index, 4, QStandardItem(type)) self.taskDetailModel.setItem(index, 5, QStandardItem(str(taskInstruction["delay"]))) self.taskDetailModel.setItem(index, 6, QStandardItem(str(taskInstruction["loop"]))) self.taskDetailModel.setItem(index, 7, QStandardItem(taskInstruction["target_param"])) self.taskDetailModel.setItem(index, 8, QStandardItem("")) self.taskDetailModel.setItem(index, 9, QStandardItem(str(taskInstruction["level"]))) self.setUnEditableStyle(self.taskDetailModel.item(index, 2)) self.setUnEditableStyle(self.taskDetailModel.item(index, 3)) self.setUnEditableStyle(self.taskDetailModel.item(index, 4)) devModel = devModelManager.getInfo(dev_model_id) if devModel != None: attr_json_dict = devModel["attr"] devmodelInterfacetypes = {} if "interfaceType" in attr_json_dict: devmodelInterfacetypes = attr_json_dict["interfaceType"] devInterfaceIndex = 0 if len(devmodelInterfacetypes) > 0: cmb = NoWheelComboBox() cmb.currentIndexChanged.connect(self.changeInterface) for devmodelInterfacetype in devmodelInterfacetypes: cmb.addItem(devmodelInterfacetype) interface_index = "interface_index" in taskInstruction and taskInstruction["interface_index"] or 0 interface_index = interface_index != "" and interface_index or 0 if interface_index < len(devmodelInterfacetypes): cmb.setCurrentIndex(interface_index) self.taskDetailModel.setItem(index, 8, QStandardItem(str(interface_index))) else: cmb.setCurrentIndex(0) self.taskDetailModel.setItem(index, 8, QStandardItem("0")) self.ui.tableViewTaskDetail.setIndexWidget(self.taskDetailModel.index(index, 8), cmb) self.batchOperation() self.loadPageTaskDetail(taskId, row + limit,limit) else: return # 切换接口 def changeInterface(self,index): if len(self.ui.tableViewTaskDetail.selectionModel().selectedRows())== 1: row = self.ui.tableViewTaskDetail.selectionModel().selectedRows()[0].row() self.taskDetailModel.setItem(row, 8 , QStandardItem(str(index))) def addProject(self): self.createProjectDlg.showCreateDlg() def setCurrentProject(self): indexs = self.ui.tableViewPro.selectionModel().selectedRows() if len(indexs) == 1: row = indexs[0].row() row_proId_index = self.projectModel.index(row, 0, QModelIndex()) proId = self.projectModel.data(row_proId_index) projectManager.setCurrentProId(proId) def handleFileOpen(self): indexs = self.ui.treeViewFile.selectionModel().selectedRows() if len(indexs) == 1: os.startfile(self.fileSystemModel.filePath(indexs[0])) def findTopLevelParent(self, widget): parent = widget.parent() while parent and not isinstance(parent, QMainWindow): # 顶层窗口是 QMainWindow widget = parent parent = widget.parent() return parent # 删除工程 def deleteProject(self): indexs = self.ui.tableViewPro.selectionModel().selectedRows() if len(indexs) == 1: row = indexs[0].row() row_proName_index = self.projectModel.index(row, 1, QModelIndex()) projectName = self.projectModel.data(row_proName_index, Qt.ItemDataRole.DisplayRole) if self.topWidget == None: self.topWidget = self.findTopLevelParent(self) if self.topWidget != None: if self.topWidget.removeDialog(projectName,"删除工程"): row_index = self.projectModel.index(row, 0, QModelIndex()) proId = self.projectModel.data(row_index, Qt.ItemDataRole.DisplayRole) if projectManager.delete(proId): self.clearChildrenModel() self.loadProject() else: QMessageBox.warning(self, '警告', '请选择要删除的工程', QMessageBox.StandardButton.Ok) return def clearChildrenModel(self): self.propertyModel.clear() self.proHistoryModel.clear() def editProject(self): if len(self.ui.tableViewPro.selectionModel().selectedRows())== 1: row = self.ui.tableViewPro.selectionModel().selectedRows()[0].row() row_proId_index = self.projectModel.index(row, 0, QModelIndex()) pro_id = self.projectModel.data(row_proId_index, Qt.ItemDataRole.DisplayRole) if pro_id != "": self.createProjectDlg.showEditDlg(pro_id) def refreshSelect(self): selectedRows = self.ui.tableViewPro.selectionModel().selectedRows() self.loadProject() if len(selectedRows) < 1: self.ui.tableViewPro.selectRow(0) if len(selectedRows)== 1: row = selectedRows[0].row() self.ui.tableViewPro.selectRow(row) def handleProSelection(self): if len(self.ui.tableViewPro.selectionModel().selectedRows())== 1: row = self.ui.tableViewPro.selectionModel().selectedRows()[0].row() row_index = self.projectModel.index(row, 0, QModelIndex()) proId = self.projectModel.data(row_index, Qt.ItemDataRole.DisplayRole) self.loadProProperty(proId) self.batchOperation() # 添加属性 def addProperty(self): if len(self.ui.tableViewPro.selectionModel().selectedRows())== 1: # 列表末位名称为空不允许创建 if self.propertyModel.rowCount() > 0: lastIndex = self.propertyModel.rowCount() - 1 if self.propertyModel.item(lastIndex, 0).text().strip() == "": self.ui.tableViewProperty.edit(self.propertyModel.index(lastIndex, 0)) return index = self.propertyModel.rowCount() self.propertyModel.appendRow([QStandardItem(), QStandardItem()]) self.ui.tableViewProperty.setCurrentIndex(self.propertyModel.index(index, 0) ) self.ui.tableViewProperty.edit(self.propertyModel.index(index, 0)) # 删除属性 def deleteProperty(self): if len(self.ui.tableViewPro.selectionModel().selectedRows())== 1: if len(self.ui.tableViewProperty.selectionModel().selectedRows())== 1: row = self.ui.tableViewProperty.selectionModel().selectedRows()[0].row() #不删固定属性 if row > 3: self.propertyModel.removeRow(row) self.updateProperty() # 更新属性 def updateProperty(self): if len(self.ui.tableViewPro.selectionModel().selectedRows())== 1: row = self.ui.tableViewPro.selectionModel().selectedRows()[0].row() row_id_index = self.projectModel.index(row, 0, QModelIndex()) proId = self.projectModel.data(row_id_index, Qt.ItemDataRole.DisplayRole) #固定属性 remark = "" operator = "" createDate = "" lastDate = "" attr = {} for row in range(self.propertyModel.rowCount()): if self.propertyModel.item(row, 0).text() == "备注": remark = self.propertyModel.item(row, 1).text() elif self.propertyModel.item(row, 0).text() == "人员": operator = self.propertyModel.item(row, 1).text() elif self.propertyModel.item(row, 0).text() == "创建时间": createDate = self.propertyModel.item(row, 1).text() elif self.propertyModel.item(row, 0).text() == "上次打开时间": lastDate = self.propertyModel.item(row, 1).text() else: attr[self.propertyModel.item(row, 0).text()] = self.propertyModel.item(row, 1).text() param = { "remark":remark, "operator":operator, "createDate":createDate, "lastDate":lastDate, "attr": attr } projectManager.update(proId, param) #设置不可编辑样式 def setUnEditableStyle(self, item): item.setEditable(False) # item.setForeground(QColor(79, 79, 79)) # item.setBackground(QColor(240, 240, 240)) def loadProProperty(self, proId): info = projectManager.getInfo(proId) taskInfo = projectManager.getProTask(proId) self.targetIds = "task" in taskInfo and taskInfo["task"] or [] self.targetParams = "params" in taskInfo and taskInfo["params"] or {} self.loadTask() info["history"] = projectManager.getCmdHistory(proId) if info == None: self.loadProject() self.clearChildrenModel() else: #阻塞propertyModel信号 self.propertyModel.blockSignals(True) self.propertyModel.clear() self.propertyModel.setItem(0, 0, QStandardItem("备注")) self.propertyModel.setItem(0, 1, QStandardItem(info["remark"])) self.propertyModel.setItem(1, 0, QStandardItem("人员")) self.propertyModel.setItem(1, 1, QStandardItem(info["operator"])) self.propertyModel.setItem(2, 0, QStandardItem("创建时间")) self.propertyModel.setItem(2, 1, QStandardItem(info["createDate"])) self.propertyModel.setItem(3, 0, QStandardItem("上次打开时间")) self.propertyModel.setItem(3, 1, QStandardItem(info["lastDate"])) self.setUnEditableStyle(self.propertyModel.item(0, 0)) self.setUnEditableStyle(self.propertyModel.item(1, 0)) self.setUnEditableStyle(self.propertyModel.item(2, 0)) self.setUnEditableStyle(self.propertyModel.item(3, 0)) self.setUnEditableStyle(self.propertyModel.item(1, 1)) self.setUnEditableStyle(self.propertyModel.item(2, 1)) self.setUnEditableStyle(self.propertyModel.item(3, 1)) for key in info["attr"]: self.propertyModel.appendRow([QStandardItem(key), QStandardItem(info["attr"][key])]) #解除propertyModel阻塞 self.propertyModel.blockSignals(False) self.proHistoryModel.blockSignals(True) self.proHistoryModel.clear() for history in info["history"]: strtype = ProjectForm.TASK == history["type"] and "任务" or (ProjectForm.VIRTUAL == history["type"] and "虚拟任务" or "指令") self.proHistoryModel.appendRow([ QStandardItem(history["time"]), QStandardItem(strtype), QStandardItem(history["name"]), QStandardItem(history["event"]), QStandardItem(history["operator"])]) self.proHistoryModel.blockSignals(False) self.ui.treeViewFile.setRootIndex(self.fileSystemModel.index(os.path.join(self.basePath, proId))) def setSplitterStretchFactor(self): self.ui.splitter.setStretchFactor(0, 30) self.ui.splitter.setStretchFactor(1, 30) self.ui.splitter.setStretchFactor(2, 40) # def resizeEvent(self, event): # # 在窗口或控件的尺寸发生变化时调用 # super().resizeEvent(event) # 批量操作 def batchOperation(self): self.setAllHorizontalHeaderLabels() self.hideAllColumn() self.setAllColumnWidth() # 批量设置列宽 def setAllColumnWidth(self): try: if self.projectModel.rowCount() > 0: self.ui.tableViewPro.horizontalHeader().setSectionResizeMode(1,QHeaderView.ResizeMode.Stretch) self.ui.tableViewPro.horizontalHeader().setSectionResizeMode(2,QHeaderView.ResizeMode.Interactive) if self.propertyModel.rowCount() > 0: self.ui.tableViewProperty.horizontalHeader().setSectionResizeMode(0, QHeaderView.ResizeMode.Stretch) self.ui.tableViewProperty.horizontalHeader().setSectionResizeMode(1, QHeaderView.ResizeMode.Stretch) if self.proHistoryModel.rowCount() > 0: self.ui.tableViewHistory.horizontalHeader().setSectionResizeMode(0,QHeaderView.ResizeMode.Stretch) self.ui.tableViewHistory.horizontalHeader().setSectionResizeMode(1,QHeaderView.ResizeMode.ResizeToContents) self.ui.tableViewHistory.horizontalHeader().setSectionResizeMode(2,QHeaderView.ResizeMode.Stretch) self.ui.tableViewHistory.horizontalHeader().setSectionResizeMode(3,QHeaderView.ResizeMode.ResizeToContents) self.ui.tableViewHistory.horizontalHeader().setSectionResizeMode(4,QHeaderView.ResizeMode.ResizeToContents) if self.taskModel.rowCount() > 0: self.ui.tableViewTask.horizontalHeader().setSectionResizeMode(1,QHeaderView.ResizeMode.ResizeToContents) self.ui.tableViewTask.horizontalHeader().setSectionResizeMode(2,QHeaderView.ResizeMode.Stretch) self.ui.tableViewTask.horizontalHeader().setSectionResizeMode(3,QHeaderView.ResizeMode.Stretch) self.ui.tableViewTask.horizontalHeader().setSectionResizeMode(4,QHeaderView.ResizeMode.Stretch) self.ui.tableViewTask.horizontalHeader().setSectionResizeMode(5,QHeaderView.ResizeMode.Interactive) if self.taskDetailModel.rowCount() > 0: self.ui.tableViewTaskDetail.horizontalHeader().setSectionResizeMode(2,QHeaderView.ResizeMode.ResizeToContents) self.ui.tableViewTaskDetail.horizontalHeader().setSectionResizeMode(3,QHeaderView.ResizeMode.ResizeToContents) self.ui.tableViewTaskDetail.horizontalHeader().setSectionResizeMode(4,QHeaderView.ResizeMode.Stretch) self.ui.tableViewTaskDetail.horizontalHeader().setSectionResizeMode(5,QHeaderView.ResizeMode.Stretch) self.ui.tableViewTaskDetail.horizontalHeader().setSectionResizeMode(6,QHeaderView.ResizeMode.Stretch) self.ui.tableViewTaskDetail.horizontalHeader().setSectionResizeMode(7,QHeaderView.ResizeMode.Stretch) self.ui.tableViewTaskDetail.horizontalHeader().setSectionResizeMode(8,QHeaderView.ResizeMode.Interactive) except Exception as e: print(e) def save_column_widths(self): settings = QSettings("TG", "projectFrom") tables = [ self.ui.tableViewPro, self.ui.tableViewProperty, self.ui.tableViewHistory, self.ui.tableViewTask, self.ui.tableViewTaskDetail ] for i, table in enumerate(tables): for column in range(table.model().columnCount()): width = table.columnWidth(column) print(f"SAVE table_{i}_column_{column}_width: {width}") settings.setValue(f"table_{i}_column_{column}_width", width) def load_column_widths(self): settings = QSettings("TG", "projectFrom") tables = [ self.ui.tableViewPro, self.ui.tableViewProperty, self.ui.tableViewHistory, self.ui.tableViewTask, self.ui.tableViewTaskDetail ] for i, table in enumerate(tables): for column in range(table.model().columnCount()): width = settings.value(f"table_{i}_column_{column}_width", type=int) print(f"LOAD table_{i}_column_{column}_width:", width) if width is not None: print(f"LOAD table_{i}_column_{column}_width:", width) table.setColumnWidth(column, width) # 批量设置标题 def setAllHorizontalHeaderLabels(self): self.projectModel.setHorizontalHeaderLabels(["ID"," 名称"," 活动"]) self.propertyModel.setHorizontalHeaderLabels([" 属性", " 值"]) self.proHistoryModel.setHorizontalHeaderLabels([" 时间", " 类型", " 名称", " 事件", " 人员"]) self.taskModel.setHorizontalHeaderLabels(["ID"," 名称", " 循环次数", " 间隔时间(ms)", " 参数", "进度","组ID"]) self.taskDetailModel.setHorizontalHeaderLabels(["ID","任务ID"," 设备"," 名称", " 类型", " 间隔时间(ms)", " 循环次数", " 参数", "端口", "序号"]) # 隐藏指定列 def hideAllColumn(self): self.ui.tableViewPro.setColumnHidden(0, True) self.ui.tableViewPro.setColumnHidden(3, True) self.ui.tableViewTask.setColumnHidden(0, True) self.ui.tableViewTask.setColumnHidden(6, True) self.ui.tableViewTaskDetail.setColumnHidden(0, True) self.ui.tableViewTaskDetail.setColumnHidden(1, True) self.ui.tableViewTaskDetail.setColumnHidden(9, True) def proCheckedChanged(self): checked = self.sender().isChecked() if checked: index = self.ui.tableViewPro.currentIndex() if index.isValid(): proId = "" self.currentProjectIndex = index.row() self.settings.setValue("currentProjectIndex", self.currentProjectIndex) proId = self.projectModel.item(index.row(), 0).text() proName = self.projectModel.item(index.row(), 1).text() projectManager.setCurrentProId(proId) influxdb.create(proName) def editProFinished(self, proname): if len(self.ui.tableViewPro.selectionModel().selectedRows())== 1: row = self.ui.tableViewPro.selectionModel().selectedRows()[0].row() proId = self.projectModel.item(row, 0).text() self.projectModel.setItem(row, 1, QStandardItem(proname)) projectManager.updateProId(proId) if self.projectModel.rowCount() > 0: self.ui.tableViewPro.selectRow(row) def createProFinished(self): self.loadProject() if self.projectModel.rowCount() > 0: self.ui.tableViewPro.selectRow(self.projectModel.rowCount()-1) def loadProject(self): try: self.projectModel.clear() infos = projectManager.getInfo("all") if len(infos) == 0: projectManager.setCurrentProId(common.emputyProId) return for info in infos: index = self.projectModel.rowCount() self.projectModel.setItem(index, 0, QStandardItem(infos[info]["id"])) self.projectModel.setItem(index, 1, QStandardItem(infos[info]["name"])) radio = QRadioButton() radio.setStyleSheet("QRadioButton::indicator {" " subcontrol-origin: padding;" " subcontrol-position: center;" "}") radio.toggled.connect(self.proCheckedChanged) self.projectModel.setItem(index, 2 , QStandardItem()) if index == self.currentProjectIndex: self.ui.tableViewPro.selectRow(index) radio.setChecked(True) projectManager.setCurrentProId(infos[info]["id"]) else: radio.setChecked(False) self.ui.tableViewPro.setIndexWidget(self.projectModel.index(index, 2), radio) self.batchOperation() except Exception as e: log.error(e)