TG-PlatformPlus/projectForm.py

690 lines
36 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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)