|
|
|
@ -133,81 +133,815 @@ class ProcedureEditor(QWidget):
|
|
|
|
|
self.createButtonSection(layout)
|
|
|
|
|
|
|
|
|
|
def createBasicInfoSection(self, layout):
|
|
|
|
|
"""创建基本信息区域"""
|
|
|
|
|
"""创建基本信息区域 - 优化为紧凑布局"""
|
|
|
|
|
info_group = QWidget()
|
|
|
|
|
info_group.setObjectName("basicInfoGroup") # 设置对象名称以便QSS选择器使用
|
|
|
|
|
info_group.setObjectName("basicInfoGroup")
|
|
|
|
|
info_group.setMaximumHeight(80) # 限制基本信息区域的最大高度
|
|
|
|
|
info_group.setMinimumHeight(80)
|
|
|
|
|
layout.addWidget(info_group)
|
|
|
|
|
|
|
|
|
|
# 标题
|
|
|
|
|
info_title = QLabel("基本信息")
|
|
|
|
|
info_layout = QVBoxLayout()
|
|
|
|
|
info_layout.setContentsMargins(8, 4, 8, 4) # 减小边距
|
|
|
|
|
info_layout.setSpacing(4) # 减小间距
|
|
|
|
|
info_group.setLayout(info_layout)
|
|
|
|
|
|
|
|
|
|
# 标题
|
|
|
|
|
info_title = QLabel("基本信息")
|
|
|
|
|
info_title.setObjectName("basicInfoTitle")
|
|
|
|
|
info_layout.addWidget(info_title)
|
|
|
|
|
|
|
|
|
|
# 使用网格布局实现紧凑的两行布局
|
|
|
|
|
grid_layout = QHBoxLayout()
|
|
|
|
|
grid_layout.setSpacing(16)
|
|
|
|
|
|
|
|
|
|
# 第一列
|
|
|
|
|
col1_layout = QHBoxLayout()
|
|
|
|
|
col1_layout.setSpacing(8)
|
|
|
|
|
|
|
|
|
|
# 规程名称
|
|
|
|
|
name_label = QLabel("规程名称:")
|
|
|
|
|
name_label.setFixedWidth(60)
|
|
|
|
|
name_label.setProperty("fieldLabel", True)
|
|
|
|
|
self.nameEdit = QLineEdit()
|
|
|
|
|
self.nameEdit.setPlaceholderText("输入规程名称")
|
|
|
|
|
self.nameEdit.setObjectName("procedureNameEdit")
|
|
|
|
|
self.nameEdit.setMaximumHeight(32)
|
|
|
|
|
col1_layout.addWidget(name_label)
|
|
|
|
|
col1_layout.addWidget(self.nameEdit)
|
|
|
|
|
|
|
|
|
|
# 规程编号
|
|
|
|
|
number_label = QLabel("规程编号:")
|
|
|
|
|
number_label.setFixedWidth(60)
|
|
|
|
|
number_label.setProperty("fieldLabel", True)
|
|
|
|
|
self.numberEdit = QLineEdit()
|
|
|
|
|
self.numberEdit.setPlaceholderText("输入规程编号")
|
|
|
|
|
self.numberEdit.setObjectName("procedureNumberEdit")
|
|
|
|
|
self.numberEdit.setMaximumHeight(32)
|
|
|
|
|
col1_layout.addWidget(number_label)
|
|
|
|
|
col1_layout.addWidget(self.numberEdit)
|
|
|
|
|
|
|
|
|
|
grid_layout.addLayout(col1_layout)
|
|
|
|
|
|
|
|
|
|
# 第二列
|
|
|
|
|
col2_layout = QHBoxLayout()
|
|
|
|
|
col2_layout.setSpacing(8)
|
|
|
|
|
|
|
|
|
|
# 规程类型
|
|
|
|
|
type_label = QLabel("规程类型:")
|
|
|
|
|
type_label.setFixedWidth(60)
|
|
|
|
|
type_label.setProperty("fieldLabel", True)
|
|
|
|
|
self.typeEdit = QLineEdit()
|
|
|
|
|
self.typeEdit.setPlaceholderText("输入规程类型")
|
|
|
|
|
self.typeEdit.setObjectName("procedureTypeEdit")
|
|
|
|
|
self.typeEdit.setMaximumHeight(32)
|
|
|
|
|
col2_layout.addWidget(type_label)
|
|
|
|
|
col2_layout.addWidget(self.typeEdit)
|
|
|
|
|
|
|
|
|
|
# 规程描述(简化为单行输入)
|
|
|
|
|
desc_label = QLabel("规程描述:")
|
|
|
|
|
desc_label.setFixedWidth(60)
|
|
|
|
|
desc_label.setProperty("fieldLabel", True)
|
|
|
|
|
self.descriptionEdit = QLineEdit() # 改为单行输入
|
|
|
|
|
self.descriptionEdit.setPlaceholderText("输入规程描述")
|
|
|
|
|
self.descriptionEdit.setObjectName("procedureDescriptionEdit")
|
|
|
|
|
self.descriptionEdit.setMaximumHeight(32)
|
|
|
|
|
col2_layout.addWidget(desc_label)
|
|
|
|
|
col2_layout.addWidget(self.descriptionEdit)
|
|
|
|
|
|
|
|
|
|
grid_layout.addLayout(col2_layout)
|
|
|
|
|
grid_layout.addStretch() # 添加弹性空间
|
|
|
|
|
|
|
|
|
|
info_layout.addLayout(grid_layout)
|
|
|
|
|
|
|
|
|
|
def createStepsSection(self, layout):
|
|
|
|
|
"""创建步骤表格区域 - 优化为最大化表格显示"""
|
|
|
|
|
steps_group = QWidget()
|
|
|
|
|
steps_group.setObjectName("stepsGroup")
|
|
|
|
|
layout.addWidget(steps_group)
|
|
|
|
|
|
|
|
|
|
steps_layout = QVBoxLayout()
|
|
|
|
|
steps_layout.setContentsMargins(8, 4, 8, 4) # 减小边距
|
|
|
|
|
steps_layout.setSpacing(4) # 减小间距
|
|
|
|
|
steps_group.setLayout(steps_layout)
|
|
|
|
|
|
|
|
|
|
# 紧凑的标题和按钮行
|
|
|
|
|
header_layout = QHBoxLayout()
|
|
|
|
|
header_layout.setSpacing(8)
|
|
|
|
|
|
|
|
|
|
# 标题
|
|
|
|
|
steps_title = QLabel("步骤列表")
|
|
|
|
|
steps_title.setObjectName("stepsTitle")
|
|
|
|
|
header_layout.addWidget(steps_title)
|
|
|
|
|
|
|
|
|
|
# 添加步骤按钮(紧凑样式)
|
|
|
|
|
add_step_btn = QPushButton("添加步骤")
|
|
|
|
|
add_step_btn.setIcon(qta.icon('fa5s.plus', color='white'))
|
|
|
|
|
add_step_btn.setObjectName("addStepButton")
|
|
|
|
|
add_step_btn.setMaximumHeight(28) # 减小按钮高度
|
|
|
|
|
add_step_btn.clicked.connect(self.addStep)
|
|
|
|
|
header_layout.addWidget(add_step_btn)
|
|
|
|
|
|
|
|
|
|
# 删除步骤按钮(紧凑样式)
|
|
|
|
|
delete_step_btn = QPushButton("删除步骤")
|
|
|
|
|
delete_step_btn.setIcon(qta.icon('fa5s.trash', color='white'))
|
|
|
|
|
delete_step_btn.setObjectName("deleteStepButton")
|
|
|
|
|
delete_step_btn.setMaximumHeight(28) # 减小按钮高度
|
|
|
|
|
delete_step_btn.clicked.connect(self.deleteStep)
|
|
|
|
|
header_layout.addWidget(delete_step_btn)
|
|
|
|
|
|
|
|
|
|
header_layout.addStretch()
|
|
|
|
|
steps_layout.addLayout(header_layout)
|
|
|
|
|
|
|
|
|
|
# 步骤表格(最大化显示)
|
|
|
|
|
self.stepsTable = QTableWidget()
|
|
|
|
|
self.stepsTable.setObjectName("stepsTable")
|
|
|
|
|
self.stepsTable.setColumnCount(6)
|
|
|
|
|
self.stepsTable.setHorizontalHeaderLabels(['序号', '步骤ID', '操作', '类型', '预期值', '备注'])
|
|
|
|
|
|
|
|
|
|
# 设置表格属性
|
|
|
|
|
self.stepsTable.setSelectionBehavior(QAbstractItemView.SelectRows)
|
|
|
|
|
self.stepsTable.setEditTriggers(QAbstractItemView.AllEditTriggers)
|
|
|
|
|
self.stepsTable.setAlternatingRowColors(True) # 启用交替行颜色
|
|
|
|
|
self.stepsTable.setShowGrid(True) # 显示网格线
|
|
|
|
|
|
|
|
|
|
# 优化表格样式
|
|
|
|
|
|
|
|
|
|
# 设置列宽
|
|
|
|
|
header = self.stepsTable.horizontalHeader()
|
|
|
|
|
if header:
|
|
|
|
|
header.setSectionResizeMode(0, QHeaderView.ResizeToContents) # 序号
|
|
|
|
|
header.setSectionResizeMode(1, QHeaderView.ResizeToContents) # 步骤ID
|
|
|
|
|
header.setSectionResizeMode(2, QHeaderView.Stretch) # 操作
|
|
|
|
|
header.setSectionResizeMode(3, QHeaderView.ResizeToContents) # 类型
|
|
|
|
|
header.setSectionResizeMode(4, QHeaderView.ResizeToContents) # 预期值
|
|
|
|
|
header.setSectionResizeMode(5, QHeaderView.ResizeToContents) # 备注
|
|
|
|
|
|
|
|
|
|
# 设置最小列宽
|
|
|
|
|
self.stepsTable.setColumnWidth(0, 50) # 序号
|
|
|
|
|
self.stepsTable.setColumnWidth(1, 100) # 步骤ID
|
|
|
|
|
self.stepsTable.setColumnWidth(3, 70) # 类型
|
|
|
|
|
self.stepsTable.setColumnWidth(4, 80) # 预期值
|
|
|
|
|
self.stepsTable.setColumnWidth(5, 100) # 备注
|
|
|
|
|
|
|
|
|
|
# 添加右键菜单
|
|
|
|
|
self.stepsTable.setContextMenuPolicy(Qt.CustomContextMenu)
|
|
|
|
|
self.stepsTable.customContextMenuRequested.connect(self.showContextMenu)
|
|
|
|
|
|
|
|
|
|
steps_layout.addWidget(self.stepsTable)
|
|
|
|
|
|
|
|
|
|
def createButtonSection(self, layout):
|
|
|
|
|
"""创建紧凑的按钮区域"""
|
|
|
|
|
button_widget = QWidget()
|
|
|
|
|
button_widget.setMaximumHeight(40) # 限制按钮区域高度
|
|
|
|
|
button_widget.setMinimumHeight(40)
|
|
|
|
|
|
|
|
|
|
button_layout = QHBoxLayout()
|
|
|
|
|
button_layout.setContentsMargins(8, 4, 8, 4) # 减小边距
|
|
|
|
|
button_layout.setSpacing(8) # 减小按钮间距
|
|
|
|
|
button_widget.setLayout(button_layout)
|
|
|
|
|
|
|
|
|
|
# 保存按钮(紧凑样式)
|
|
|
|
|
save_btn = QPushButton("保存规程")
|
|
|
|
|
save_btn.setIcon(qta.icon('fa5s.save', color='white'))
|
|
|
|
|
save_btn.setObjectName("saveProcedureButton")
|
|
|
|
|
save_btn.setMaximumHeight(32) # 减小按钮高度
|
|
|
|
|
save_btn.clicked.connect(self.saveProcedure)
|
|
|
|
|
button_layout.addWidget(save_btn)
|
|
|
|
|
|
|
|
|
|
# 取消按钮(紧凑样式)
|
|
|
|
|
cancel_btn = QPushButton("取消")
|
|
|
|
|
cancel_btn.setIcon(qta.icon('fa5s.times', color='red'))
|
|
|
|
|
cancel_btn.setObjectName("cancelEditButton")
|
|
|
|
|
cancel_btn.setMaximumHeight(32) # 减小按钮高度
|
|
|
|
|
cancel_btn.clicked.connect(self.cancelEdit)
|
|
|
|
|
button_layout.addWidget(cancel_btn)
|
|
|
|
|
|
|
|
|
|
button_layout.addStretch() # 将按钮推到左侧
|
|
|
|
|
layout.addWidget(button_widget)
|
|
|
|
|
|
|
|
|
|
def loadProcedureData(self):
|
|
|
|
|
"""加载规程数据"""
|
|
|
|
|
if not self.procedureData:
|
|
|
|
|
print("警告:规程数据为空")
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
print(f"加载规程数据: {self.procedureData.keys()}")
|
|
|
|
|
|
|
|
|
|
# 加载基本信息
|
|
|
|
|
procedure_info = self.procedureData.get('规程信息', {})
|
|
|
|
|
self.nameEdit.setText(procedure_info.get('规程名称', ''))
|
|
|
|
|
self.numberEdit.setText(procedure_info.get('规程编号', ''))
|
|
|
|
|
self.typeEdit.setText(procedure_info.get('规程类型', ''))
|
|
|
|
|
|
|
|
|
|
# 加载描述(可能在不同位置)
|
|
|
|
|
description = self.procedureData.get('description', '')
|
|
|
|
|
if not description:
|
|
|
|
|
# 尝试从测试用例信息中获取描述
|
|
|
|
|
test_case_info = self.procedureData.get('测试用例信息', {})
|
|
|
|
|
description = test_case_info.get('工况描述', '')
|
|
|
|
|
self.descriptionEdit.setText(description) # 修改为setText,因为现在是QLineEdit
|
|
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
"""
|
|
|
|
|
规程编辑器
|
|
|
|
|
支持编辑规程内容并保存到数据库
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
import json
|
|
|
|
|
from datetime import datetime
|
|
|
|
|
from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QLabel,
|
|
|
|
|
QLineEdit, QTextEdit, QPushButton, QTableWidget,
|
|
|
|
|
QTableWidgetItem, QHeaderView, QMessageBox,
|
|
|
|
|
QDialog, QFormLayout, QSpinBox, QComboBox,
|
|
|
|
|
QDialogButtonBox, QAbstractItemView, QMenu)
|
|
|
|
|
from PyQt5.QtCore import Qt, pyqtSignal
|
|
|
|
|
from PyQt5.QtGui import QFont, QBrush, QColor
|
|
|
|
|
import qtawesome as qta
|
|
|
|
|
|
|
|
|
|
class NoClearDelegate(QAbstractItemView):
|
|
|
|
|
"""自定义委托,防止双击时清除内容"""
|
|
|
|
|
def createEditor(self, parent, option, index):
|
|
|
|
|
editor = super().createEditor(parent, option, index)
|
|
|
|
|
if hasattr(editor, 'setText'):
|
|
|
|
|
# 保持原有内容
|
|
|
|
|
current_text = index.data()
|
|
|
|
|
if current_text:
|
|
|
|
|
editor.setText(current_text)
|
|
|
|
|
return editor
|
|
|
|
|
|
|
|
|
|
class StepEditDialog(QDialog):
|
|
|
|
|
"""步骤编辑对话框"""
|
|
|
|
|
|
|
|
|
|
def __init__(self, step_data=None, parent=None):
|
|
|
|
|
super().__init__(parent)
|
|
|
|
|
self.setWindowTitle("编辑步骤")
|
|
|
|
|
self.setModal(True)
|
|
|
|
|
self.setMinimumWidth(500)
|
|
|
|
|
|
|
|
|
|
self.step_data = step_data or {}
|
|
|
|
|
self.initUI()
|
|
|
|
|
|
|
|
|
|
def initUI(self):
|
|
|
|
|
layout = QVBoxLayout()
|
|
|
|
|
self.setLayout(layout)
|
|
|
|
|
|
|
|
|
|
# 表单布局
|
|
|
|
|
form_layout = QFormLayout()
|
|
|
|
|
|
|
|
|
|
# 步骤ID
|
|
|
|
|
self.stepIdEdit = QLineEdit()
|
|
|
|
|
self.stepIdEdit.setText(self.step_data.get('stepId', ''))
|
|
|
|
|
form_layout.addRow("步骤ID:", self.stepIdEdit)
|
|
|
|
|
|
|
|
|
|
# 操作(合并关键词和步骤描述)
|
|
|
|
|
self.operationEdit = QTextEdit()
|
|
|
|
|
self.operationEdit.setMaximumHeight(80)
|
|
|
|
|
self.operationEdit.setPlainText(self.step_data.get('operation', ''))
|
|
|
|
|
form_layout.addRow("操作:", self.operationEdit)
|
|
|
|
|
|
|
|
|
|
# 操作类型(直接输入)
|
|
|
|
|
self.typeEdit = QLineEdit()
|
|
|
|
|
self.typeEdit.setText(self.step_data.get('type', 'SET'))
|
|
|
|
|
form_layout.addRow("操作类型:", self.typeEdit)
|
|
|
|
|
|
|
|
|
|
# 预期值
|
|
|
|
|
self.expectedValueEdit = QLineEdit()
|
|
|
|
|
self.expectedValueEdit.setText(str(self.step_data.get('expectedValue', '')))
|
|
|
|
|
form_layout.addRow("预期值:", self.expectedValueEdit)
|
|
|
|
|
|
|
|
|
|
# 备注
|
|
|
|
|
self.remarkEdit = QTextEdit()
|
|
|
|
|
self.remarkEdit.setMaximumHeight(60)
|
|
|
|
|
self.remarkEdit.setPlainText(self.step_data.get('remark', ''))
|
|
|
|
|
form_layout.addRow("备注:", self.remarkEdit)
|
|
|
|
|
|
|
|
|
|
# 序号
|
|
|
|
|
self.orderSpin = QSpinBox()
|
|
|
|
|
self.orderSpin.setRange(1, 999)
|
|
|
|
|
self.orderSpin.setValue(self.step_data.get('order', 1))
|
|
|
|
|
form_layout.addRow("序号:", self.orderSpin)
|
|
|
|
|
|
|
|
|
|
layout.addLayout(form_layout)
|
|
|
|
|
|
|
|
|
|
# 按钮
|
|
|
|
|
button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
|
|
|
|
|
button_box.accepted.connect(self.accept)
|
|
|
|
|
button_box.rejected.connect(self.reject)
|
|
|
|
|
layout.addWidget(button_box)
|
|
|
|
|
|
|
|
|
|
def getStepData(self):
|
|
|
|
|
"""获取步骤数据"""
|
|
|
|
|
return {
|
|
|
|
|
'stepId': self.stepIdEdit.text(),
|
|
|
|
|
'operation': self.operationEdit.toPlainText(),
|
|
|
|
|
'type': self.typeEdit.text(),
|
|
|
|
|
'expectedValue': self.expectedValueEdit.text(),
|
|
|
|
|
'remark': self.remarkEdit.toPlainText(),
|
|
|
|
|
'order': self.orderSpin.value()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class ProcedureEditor(QWidget):
|
|
|
|
|
"""规程编辑器"""
|
|
|
|
|
|
|
|
|
|
procedureSaved = pyqtSignal(int) # 规程保存信号
|
|
|
|
|
|
|
|
|
|
def __init__(self, procedureData, procedureId, dbManager, parent=None):
|
|
|
|
|
super().__init__(parent)
|
|
|
|
|
self.procedureData = procedureData
|
|
|
|
|
self.procedureId = procedureId
|
|
|
|
|
self.dbManager = dbManager
|
|
|
|
|
self.parent = parent
|
|
|
|
|
|
|
|
|
|
self.initUI()
|
|
|
|
|
self.loadProcedureData()
|
|
|
|
|
|
|
|
|
|
def initUI(self):
|
|
|
|
|
"""初始化界面"""
|
|
|
|
|
layout = QVBoxLayout()
|
|
|
|
|
self.setLayout(layout)
|
|
|
|
|
|
|
|
|
|
# 标题
|
|
|
|
|
title_label = QLabel("规程编辑器")
|
|
|
|
|
title_label.setObjectName("procedureEditorTitle") # 设置对象名称以便QSS选择器使用
|
|
|
|
|
layout.addWidget(title_label)
|
|
|
|
|
|
|
|
|
|
# 基本信息区域
|
|
|
|
|
self.createBasicInfoSection(layout)
|
|
|
|
|
|
|
|
|
|
# 步骤表格区域
|
|
|
|
|
self.createStepsSection(layout)
|
|
|
|
|
|
|
|
|
|
# 按钮区域
|
|
|
|
|
self.createButtonSection(layout)
|
|
|
|
|
|
|
|
|
|
def createBasicInfoSection(self, layout):
|
|
|
|
|
"""创建基本信息区域 - 优化为紧凑布局"""
|
|
|
|
|
info_group = QWidget()
|
|
|
|
|
info_group.setObjectName("basicInfoGroup")
|
|
|
|
|
info_group.setMaximumHeight(80) # 限制基本信息区域的最大高度
|
|
|
|
|
info_group.setMinimumHeight(80)
|
|
|
|
|
layout.addWidget(info_group)
|
|
|
|
|
|
|
|
|
|
info_layout = QVBoxLayout()
|
|
|
|
|
info_layout.setContentsMargins(8, 4, 8, 4) # 减小边距
|
|
|
|
|
info_layout.setSpacing(4) # 减小间距
|
|
|
|
|
info_group.setLayout(info_layout)
|
|
|
|
|
|
|
|
|
|
# 标题
|
|
|
|
|
info_title = QLabel("基本信息")
|
|
|
|
|
info_title.setObjectName("basicInfoTitle")
|
|
|
|
|
info_layout.addWidget(info_title)
|
|
|
|
|
|
|
|
|
|
# 使用网格布局实现紧凑的两行布局
|
|
|
|
|
grid_layout = QHBoxLayout()
|
|
|
|
|
grid_layout.setSpacing(16)
|
|
|
|
|
|
|
|
|
|
# 第一列
|
|
|
|
|
col1_layout = QHBoxLayout()
|
|
|
|
|
col1_layout.setSpacing(8)
|
|
|
|
|
|
|
|
|
|
# 规程名称
|
|
|
|
|
name_label = QLabel("规程名称:")
|
|
|
|
|
name_label.setFixedWidth(60)
|
|
|
|
|
name_label.setProperty("fieldLabel", True)
|
|
|
|
|
self.nameEdit = QLineEdit()
|
|
|
|
|
self.nameEdit.setPlaceholderText("输入规程名称")
|
|
|
|
|
self.nameEdit.setObjectName("procedureNameEdit") # 设置对象名称以便QSS选择器使用
|
|
|
|
|
form_layout.addRow("规程名称:", self.nameEdit)
|
|
|
|
|
self.nameEdit.setObjectName("procedureNameEdit")
|
|
|
|
|
self.nameEdit.setMaximumHeight(32)
|
|
|
|
|
col1_layout.addWidget(name_label)
|
|
|
|
|
col1_layout.addWidget(self.nameEdit)
|
|
|
|
|
|
|
|
|
|
# 规程编号
|
|
|
|
|
number_label = QLabel("规程编号:")
|
|
|
|
|
number_label.setFixedWidth(60)
|
|
|
|
|
number_label.setProperty("fieldLabel", True)
|
|
|
|
|
self.numberEdit = QLineEdit()
|
|
|
|
|
self.numberEdit.setPlaceholderText("输入规程编号")
|
|
|
|
|
self.numberEdit.setObjectName("procedureNumberEdit") # 设置对象名称以便QSS选择器使用
|
|
|
|
|
form_layout.addRow("规程编号:", self.numberEdit)
|
|
|
|
|
self.numberEdit.setObjectName("procedureNumberEdit")
|
|
|
|
|
self.numberEdit.setMaximumHeight(32)
|
|
|
|
|
col1_layout.addWidget(number_label)
|
|
|
|
|
col1_layout.addWidget(self.numberEdit)
|
|
|
|
|
|
|
|
|
|
grid_layout.addLayout(col1_layout)
|
|
|
|
|
|
|
|
|
|
# 第二列
|
|
|
|
|
col2_layout = QHBoxLayout()
|
|
|
|
|
col2_layout.setSpacing(8)
|
|
|
|
|
|
|
|
|
|
# 规程类型
|
|
|
|
|
type_label = QLabel("规程类型:")
|
|
|
|
|
type_label.setFixedWidth(60)
|
|
|
|
|
type_label.setProperty("fieldLabel", True)
|
|
|
|
|
self.typeEdit = QLineEdit()
|
|
|
|
|
self.typeEdit.setPlaceholderText("输入规程类型")
|
|
|
|
|
self.typeEdit.setObjectName("procedureTypeEdit") # 设置对象名称以便QSS选择器使用
|
|
|
|
|
form_layout.addRow("规程类型:", self.typeEdit)
|
|
|
|
|
self.typeEdit.setObjectName("procedureTypeEdit")
|
|
|
|
|
self.typeEdit.setMaximumHeight(32)
|
|
|
|
|
col2_layout.addWidget(type_label)
|
|
|
|
|
col2_layout.addWidget(self.typeEdit)
|
|
|
|
|
|
|
|
|
|
self.descriptionEdit = QTextEdit()
|
|
|
|
|
self.descriptionEdit.setMaximumHeight(80)
|
|
|
|
|
# 规程描述(简化为单行输入)
|
|
|
|
|
desc_label = QLabel("规程描述:")
|
|
|
|
|
desc_label.setFixedWidth(60)
|
|
|
|
|
desc_label.setProperty("fieldLabel", True)
|
|
|
|
|
self.descriptionEdit = QLineEdit() # 改为单行输入
|
|
|
|
|
self.descriptionEdit.setPlaceholderText("输入规程描述")
|
|
|
|
|
self.descriptionEdit.setObjectName("procedureDescriptionEdit") # 设置对象名称以便QSS选择器使用
|
|
|
|
|
form_layout.addRow("规程描述:", self.descriptionEdit)
|
|
|
|
|
self.descriptionEdit.setObjectName("procedureDescriptionEdit")
|
|
|
|
|
self.descriptionEdit.setMaximumHeight(32)
|
|
|
|
|
col2_layout.addWidget(desc_label)
|
|
|
|
|
col2_layout.addWidget(self.descriptionEdit)
|
|
|
|
|
|
|
|
|
|
info_layout.addLayout(form_layout)
|
|
|
|
|
grid_layout.addLayout(col2_layout)
|
|
|
|
|
grid_layout.addStretch() # 添加弹性空间
|
|
|
|
|
|
|
|
|
|
info_layout.addLayout(grid_layout)
|
|
|
|
|
|
|
|
|
|
def createStepsSection(self, layout):
|
|
|
|
|
"""创建步骤表格区域"""
|
|
|
|
|
"""创建步骤表格区域 - 优化为最大化表格显示"""
|
|
|
|
|
steps_group = QWidget()
|
|
|
|
|
steps_group.setObjectName("stepsGroup") # 设置对象名称以便QSS选择器使用
|
|
|
|
|
steps_group.setObjectName("stepsGroup")
|
|
|
|
|
layout.addWidget(steps_group)
|
|
|
|
|
|
|
|
|
|
# 标题和按钮
|
|
|
|
|
steps_layout = QVBoxLayout()
|
|
|
|
|
steps_layout.setContentsMargins(8, 4, 8, 4) # 减小边距
|
|
|
|
|
steps_layout.setSpacing(4) # 减小间距
|
|
|
|
|
steps_group.setLayout(steps_layout)
|
|
|
|
|
|
|
|
|
|
# 紧凑的标题和按钮行
|
|
|
|
|
header_layout = QHBoxLayout()
|
|
|
|
|
header_layout.setSpacing(8)
|
|
|
|
|
|
|
|
|
|
# 标题
|
|
|
|
|
steps_title = QLabel("步骤列表")
|
|
|
|
|
steps_title.setObjectName("stepsTitle")
|
|
|
|
|
header_layout.addWidget(steps_title)
|
|
|
|
|
|
|
|
|
|
# 添加步骤按钮
|
|
|
|
|
# 添加步骤按钮(紧凑样式)
|
|
|
|
|
add_step_btn = QPushButton("添加步骤")
|
|
|
|
|
add_step_btn.setIcon(qta.icon('fa5s.plus', color='white'))
|
|
|
|
|
add_step_btn.setObjectName("addStepButton")
|
|
|
|
|
add_step_btn.setMaximumHeight(28) # 减小按钮高度
|
|
|
|
|
add_step_btn.clicked.connect(self.addStep)
|
|
|
|
|
header_layout.addWidget(add_step_btn)
|
|
|
|
|
|
|
|
|
|
# 删除步骤按钮
|
|
|
|
|
# 删除步骤按钮(紧凑样式)
|
|
|
|
|
delete_step_btn = QPushButton("删除步骤")
|
|
|
|
|
delete_step_btn.setIcon(qta.icon('fa5s.trash', color='white'))
|
|
|
|
|
delete_step_btn.setObjectName("deleteStepButton")
|
|
|
|
|
delete_step_btn.setMaximumHeight(28) # 减小按钮高度
|
|
|
|
|
delete_step_btn.clicked.connect(self.deleteStep)
|
|
|
|
|
header_layout.addWidget(delete_step_btn)
|
|
|
|
|
|
|
|
|
|
header_layout.addStretch()
|
|
|
|
|
steps_layout.addLayout(header_layout)
|
|
|
|
|
|
|
|
|
|
# 步骤表格(最大化显示)
|
|
|
|
|
self.stepsTable = QTableWidget()
|
|
|
|
|
self.stepsTable.setObjectName("stepsTable")
|
|
|
|
|
self.stepsTable.setColumnCount(6)
|
|
|
|
|
self.stepsTable.setHorizontalHeaderLabels(['序号', '步骤ID', '操作', '类型', '预期值', '备注'])
|
|
|
|
|
|
|
|
|
|
# 设置表格属性
|
|
|
|
|
self.stepsTable.setSelectionBehavior(QAbstractItemView.SelectRows)
|
|
|
|
|
self.stepsTable.setEditTriggers(QAbstractItemView.AllEditTriggers)
|
|
|
|
|
self.stepsTable.setAlternatingRowColors(True) # 启用交替行颜色
|
|
|
|
|
self.stepsTable.setShowGrid(True) # 显示网格线
|
|
|
|
|
|
|
|
|
|
# 优化表格样式
|
|
|
|
|
|
|
|
|
|
# 设置列宽
|
|
|
|
|
header = self.stepsTable.horizontalHeader()
|
|
|
|
|
if header:
|
|
|
|
|
header.setSectionResizeMode(0, QHeaderView.ResizeToContents) # 序号
|
|
|
|
|
header.setSectionResizeMode(1, QHeaderView.ResizeToContents) # 步骤ID
|
|
|
|
|
header.setSectionResizeMode(2, QHeaderView.Stretch) # 操作
|
|
|
|
|
header.setSectionResizeMode(3, QHeaderView.ResizeToContents) # 类型
|
|
|
|
|
header.setSectionResizeMode(4, QHeaderView.ResizeToContents) # 预期值
|
|
|
|
|
header.setSectionResizeMode(5, QHeaderView.ResizeToContents) # 备注
|
|
|
|
|
|
|
|
|
|
# 设置最小列宽
|
|
|
|
|
self.stepsTable.setColumnWidth(0, 50) # 序号
|
|
|
|
|
self.stepsTable.setColumnWidth(1, 100) # 步骤ID
|
|
|
|
|
self.stepsTable.setColumnWidth(3, 70) # 类型
|
|
|
|
|
self.stepsTable.setColumnWidth(4, 80) # 预期值
|
|
|
|
|
self.stepsTable.setColumnWidth(5, 100) # 备注
|
|
|
|
|
|
|
|
|
|
# 添加右键菜单
|
|
|
|
|
self.stepsTable.setContextMenuPolicy(Qt.CustomContextMenu)
|
|
|
|
|
self.stepsTable.customContextMenuRequested.connect(self.showContextMenu)
|
|
|
|
|
|
|
|
|
|
steps_layout.addWidget(self.stepsTable)
|
|
|
|
|
|
|
|
|
|
def createButtonSection(self, layout):
|
|
|
|
|
"""创建紧凑的按钮区域"""
|
|
|
|
|
button_widget = QWidget()
|
|
|
|
|
button_widget.setMaximumHeight(40) # 限制按钮区域高度
|
|
|
|
|
button_widget.setMinimumHeight(40)
|
|
|
|
|
|
|
|
|
|
button_layout = QHBoxLayout()
|
|
|
|
|
button_layout.setContentsMargins(8, 4, 8, 4) # 减小边距
|
|
|
|
|
button_layout.setSpacing(8) # 减小按钮间距
|
|
|
|
|
button_widget.setLayout(button_layout)
|
|
|
|
|
|
|
|
|
|
# 保存按钮(紧凑样式)
|
|
|
|
|
save_btn = QPushButton("保存规程")
|
|
|
|
|
save_btn.setIcon(qta.icon('fa5s.save', color='white'))
|
|
|
|
|
save_btn.setObjectName("saveProcedureButton")
|
|
|
|
|
save_btn.setMaximumHeight(32) # 减小按钮高度
|
|
|
|
|
save_btn.clicked.connect(self.saveProcedure)
|
|
|
|
|
button_layout.addWidget(save_btn)
|
|
|
|
|
|
|
|
|
|
# 取消按钮(紧凑样式)
|
|
|
|
|
cancel_btn = QPushButton("取消")
|
|
|
|
|
cancel_btn.setIcon(qta.icon('fa5s.times', color='red'))
|
|
|
|
|
cancel_btn.setObjectName("cancelEditButton")
|
|
|
|
|
cancel_btn.setMaximumHeight(32) # 减小按钮高度
|
|
|
|
|
cancel_btn.clicked.connect(self.cancelEdit)
|
|
|
|
|
button_layout.addWidget(cancel_btn)
|
|
|
|
|
|
|
|
|
|
button_layout.addStretch() # 将按钮推到左侧
|
|
|
|
|
layout.addWidget(button_widget)
|
|
|
|
|
|
|
|
|
|
def loadProcedureData(self):
|
|
|
|
|
"""加载规程数据"""
|
|
|
|
|
if not self.procedureData:
|
|
|
|
|
print("警告:规程数据为空")
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
print(f"加载规程数据: {self.procedureData.keys()}")
|
|
|
|
|
|
|
|
|
|
# 加载基本信息
|
|
|
|
|
procedure_info = self.procedureData.get('规程信息', {})
|
|
|
|
|
self.nameEdit.setText(procedure_info.get('规程名称', ''))
|
|
|
|
|
self.numberEdit.setText(procedure_info.get('规程编号', ''))
|
|
|
|
|
self.typeEdit.setText(procedure_info.get('规程类型', ''))
|
|
|
|
|
|
|
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
"""
|
|
|
|
|
规程编辑器
|
|
|
|
|
支持编辑规程内容并保存到数据库
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
import json
|
|
|
|
|
from datetime import datetime
|
|
|
|
|
from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QLabel,
|
|
|
|
|
QLineEdit, QTextEdit, QPushButton, QTableWidget,
|
|
|
|
|
QTableWidgetItem, QHeaderView, QMessageBox,
|
|
|
|
|
QDialog, QFormLayout, QSpinBox, QComboBox,
|
|
|
|
|
QDialogButtonBox, QAbstractItemView, QMenu)
|
|
|
|
|
from PyQt5.QtCore import Qt, pyqtSignal
|
|
|
|
|
from PyQt5.QtGui import QFont, QBrush, QColor
|
|
|
|
|
import qtawesome as qta
|
|
|
|
|
|
|
|
|
|
class NoClearDelegate(QAbstractItemView):
|
|
|
|
|
"""自定义委托,防止双击时清除内容"""
|
|
|
|
|
def createEditor(self, parent, option, index):
|
|
|
|
|
editor = super().createEditor(parent, option, index)
|
|
|
|
|
if hasattr(editor, 'setText'):
|
|
|
|
|
# 保持原有内容
|
|
|
|
|
current_text = index.data()
|
|
|
|
|
if current_text:
|
|
|
|
|
editor.setText(current_text)
|
|
|
|
|
return editor
|
|
|
|
|
|
|
|
|
|
class StepEditDialog(QDialog):
|
|
|
|
|
"""步骤编辑对话框"""
|
|
|
|
|
|
|
|
|
|
def __init__(self, step_data=None, parent=None):
|
|
|
|
|
super().__init__(parent)
|
|
|
|
|
self.setWindowTitle("编辑步骤")
|
|
|
|
|
self.setModal(True)
|
|
|
|
|
self.setMinimumWidth(500)
|
|
|
|
|
|
|
|
|
|
self.step_data = step_data or {}
|
|
|
|
|
self.initUI()
|
|
|
|
|
|
|
|
|
|
def initUI(self):
|
|
|
|
|
layout = QVBoxLayout()
|
|
|
|
|
self.setLayout(layout)
|
|
|
|
|
|
|
|
|
|
# 表单布局
|
|
|
|
|
form_layout = QFormLayout()
|
|
|
|
|
|
|
|
|
|
# 步骤ID
|
|
|
|
|
self.stepIdEdit = QLineEdit()
|
|
|
|
|
self.stepIdEdit.setText(self.step_data.get('stepId', ''))
|
|
|
|
|
form_layout.addRow("步骤ID:", self.stepIdEdit)
|
|
|
|
|
|
|
|
|
|
# 操作(合并关键词和步骤描述)
|
|
|
|
|
self.operationEdit = QTextEdit()
|
|
|
|
|
self.operationEdit.setMaximumHeight(80)
|
|
|
|
|
self.operationEdit.setPlainText(self.step_data.get('operation', ''))
|
|
|
|
|
form_layout.addRow("操作:", self.operationEdit)
|
|
|
|
|
|
|
|
|
|
# 操作类型(直接输入)
|
|
|
|
|
self.typeEdit = QLineEdit()
|
|
|
|
|
self.typeEdit.setText(self.step_data.get('type', 'SET'))
|
|
|
|
|
form_layout.addRow("操作类型:", self.typeEdit)
|
|
|
|
|
|
|
|
|
|
# 预期值
|
|
|
|
|
self.expectedValueEdit = QLineEdit()
|
|
|
|
|
self.expectedValueEdit.setText(str(self.step_data.get('expectedValue', '')))
|
|
|
|
|
form_layout.addRow("预期值:", self.expectedValueEdit)
|
|
|
|
|
|
|
|
|
|
# 备注
|
|
|
|
|
self.remarkEdit = QTextEdit()
|
|
|
|
|
self.remarkEdit.setMaximumHeight(60)
|
|
|
|
|
self.remarkEdit.setPlainText(self.step_data.get('remark', ''))
|
|
|
|
|
form_layout.addRow("备注:", self.remarkEdit)
|
|
|
|
|
|
|
|
|
|
# 序号
|
|
|
|
|
self.orderSpin = QSpinBox()
|
|
|
|
|
self.orderSpin.setRange(1, 999)
|
|
|
|
|
self.orderSpin.setValue(self.step_data.get('order', 1))
|
|
|
|
|
form_layout.addRow("序号:", self.orderSpin)
|
|
|
|
|
|
|
|
|
|
layout.addLayout(form_layout)
|
|
|
|
|
|
|
|
|
|
# 按钮
|
|
|
|
|
button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
|
|
|
|
|
button_box.accepted.connect(self.accept)
|
|
|
|
|
button_box.rejected.connect(self.reject)
|
|
|
|
|
layout.addWidget(button_box)
|
|
|
|
|
|
|
|
|
|
def getStepData(self):
|
|
|
|
|
"""获取步骤数据"""
|
|
|
|
|
return {
|
|
|
|
|
'stepId': self.stepIdEdit.text(),
|
|
|
|
|
'operation': self.operationEdit.toPlainText(),
|
|
|
|
|
'type': self.typeEdit.text(),
|
|
|
|
|
'expectedValue': self.expectedValueEdit.text(),
|
|
|
|
|
'remark': self.remarkEdit.toPlainText(),
|
|
|
|
|
'order': self.orderSpin.value()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class ProcedureEditor(QWidget):
|
|
|
|
|
"""规程编辑器"""
|
|
|
|
|
|
|
|
|
|
procedureSaved = pyqtSignal(int) # 规程保存信号
|
|
|
|
|
|
|
|
|
|
def __init__(self, procedureData, procedureId, dbManager, parent=None):
|
|
|
|
|
super().__init__(parent)
|
|
|
|
|
self.procedureData = procedureData
|
|
|
|
|
self.procedureId = procedureId
|
|
|
|
|
self.dbManager = dbManager
|
|
|
|
|
self.parent = parent
|
|
|
|
|
|
|
|
|
|
self.initUI()
|
|
|
|
|
self.loadProcedureData()
|
|
|
|
|
|
|
|
|
|
def initUI(self):
|
|
|
|
|
"""初始化界面"""
|
|
|
|
|
layout = QVBoxLayout()
|
|
|
|
|
self.setLayout(layout)
|
|
|
|
|
|
|
|
|
|
# 标题
|
|
|
|
|
title_label = QLabel("规程编辑器")
|
|
|
|
|
title_label.setObjectName("procedureEditorTitle") # 设置对象名称以便QSS选择器使用
|
|
|
|
|
layout.addWidget(title_label)
|
|
|
|
|
|
|
|
|
|
# 基本信息区域
|
|
|
|
|
self.createBasicInfoSection(layout)
|
|
|
|
|
|
|
|
|
|
# 步骤表格区域
|
|
|
|
|
self.createStepsSection(layout)
|
|
|
|
|
|
|
|
|
|
# 按钮区域
|
|
|
|
|
self.createButtonSection(layout)
|
|
|
|
|
|
|
|
|
|
def createBasicInfoSection(self, layout):
|
|
|
|
|
"""创建基本信息区域 - 优化为紧凑布局"""
|
|
|
|
|
info_group = QWidget()
|
|
|
|
|
info_group.setObjectName("basicInfoGroup")
|
|
|
|
|
info_group.setMaximumHeight(80) # 限制基本信息区域的最大高度
|
|
|
|
|
info_group.setMinimumHeight(80)
|
|
|
|
|
layout.addWidget(info_group)
|
|
|
|
|
|
|
|
|
|
info_layout = QVBoxLayout()
|
|
|
|
|
info_layout.setContentsMargins(8, 4, 8, 4) # 减小边距
|
|
|
|
|
info_layout.setSpacing(4) # 减小间距
|
|
|
|
|
info_group.setLayout(info_layout)
|
|
|
|
|
|
|
|
|
|
# 标题
|
|
|
|
|
info_title = QLabel("基本信息")
|
|
|
|
|
info_title.setObjectName("basicInfoTitle")
|
|
|
|
|
info_layout.addWidget(info_title)
|
|
|
|
|
|
|
|
|
|
# 使用网格布局实现紧凑的两行布局
|
|
|
|
|
grid_layout = QHBoxLayout()
|
|
|
|
|
grid_layout.setSpacing(16)
|
|
|
|
|
|
|
|
|
|
# 第一列
|
|
|
|
|
col1_layout = QHBoxLayout()
|
|
|
|
|
col1_layout.setSpacing(8)
|
|
|
|
|
|
|
|
|
|
# 规程名称
|
|
|
|
|
name_label = QLabel("规程名称:")
|
|
|
|
|
name_label.setFixedWidth(60)
|
|
|
|
|
name_label.setProperty("fieldLabel", True)
|
|
|
|
|
self.nameEdit = QLineEdit()
|
|
|
|
|
self.nameEdit.setPlaceholderText("输入规程名称")
|
|
|
|
|
self.nameEdit.setObjectName("procedureNameEdit")
|
|
|
|
|
self.nameEdit.setMaximumHeight(32)
|
|
|
|
|
col1_layout.addWidget(name_label)
|
|
|
|
|
col1_layout.addWidget(self.nameEdit)
|
|
|
|
|
|
|
|
|
|
# 规程编号
|
|
|
|
|
number_label = QLabel("规程编号:")
|
|
|
|
|
number_label.setFixedWidth(60)
|
|
|
|
|
number_label.setProperty("fieldLabel", True)
|
|
|
|
|
self.numberEdit = QLineEdit()
|
|
|
|
|
self.numberEdit.setPlaceholderText("输入规程编号")
|
|
|
|
|
self.numberEdit.setObjectName("procedureNumberEdit")
|
|
|
|
|
self.numberEdit.setMaximumHeight(32)
|
|
|
|
|
col1_layout.addWidget(number_label)
|
|
|
|
|
col1_layout.addWidget(self.numberEdit)
|
|
|
|
|
|
|
|
|
|
grid_layout.addLayout(col1_layout)
|
|
|
|
|
|
|
|
|
|
# 第二列
|
|
|
|
|
col2_layout = QHBoxLayout()
|
|
|
|
|
col2_layout.setSpacing(8)
|
|
|
|
|
|
|
|
|
|
# 规程类型
|
|
|
|
|
type_label = QLabel("规程类型:")
|
|
|
|
|
type_label.setFixedWidth(60)
|
|
|
|
|
type_label.setProperty("fieldLabel", True)
|
|
|
|
|
self.typeEdit = QLineEdit()
|
|
|
|
|
self.typeEdit.setPlaceholderText("输入规程类型")
|
|
|
|
|
self.typeEdit.setObjectName("procedureTypeEdit")
|
|
|
|
|
self.typeEdit.setMaximumHeight(32)
|
|
|
|
|
col2_layout.addWidget(type_label)
|
|
|
|
|
col2_layout.addWidget(self.typeEdit)
|
|
|
|
|
|
|
|
|
|
# 规程描述(简化为单行输入)
|
|
|
|
|
desc_label = QLabel("规程描述:")
|
|
|
|
|
desc_label.setFixedWidth(60)
|
|
|
|
|
desc_label.setProperty("fieldLabel", True)
|
|
|
|
|
self.descriptionEdit = QLineEdit() # 改为单行输入
|
|
|
|
|
self.descriptionEdit.setPlaceholderText("输入规程描述")
|
|
|
|
|
self.descriptionEdit.setObjectName("procedureDescriptionEdit")
|
|
|
|
|
self.descriptionEdit.setMaximumHeight(32)
|
|
|
|
|
col2_layout.addWidget(desc_label)
|
|
|
|
|
col2_layout.addWidget(self.descriptionEdit)
|
|
|
|
|
|
|
|
|
|
grid_layout.addLayout(col2_layout)
|
|
|
|
|
grid_layout.addStretch() # 添加弹性空间
|
|
|
|
|
|
|
|
|
|
info_layout.addLayout(grid_layout)
|
|
|
|
|
|
|
|
|
|
def createStepsSection(self, layout):
|
|
|
|
|
"""创建步骤表格区域 - 优化为最大化表格显示"""
|
|
|
|
|
steps_group = QWidget()
|
|
|
|
|
steps_group.setObjectName("stepsGroup")
|
|
|
|
|
layout.addWidget(steps_group)
|
|
|
|
|
|
|
|
|
|
steps_layout = QVBoxLayout()
|
|
|
|
|
steps_layout.setContentsMargins(8, 4, 8, 4) # 减小边距
|
|
|
|
|
steps_layout.setSpacing(4) # 减小间距
|
|
|
|
|
steps_group.setLayout(steps_layout)
|
|
|
|
|
|
|
|
|
|
# 紧凑的标题和按钮行
|
|
|
|
|
header_layout = QHBoxLayout()
|
|
|
|
|
header_layout.setSpacing(8)
|
|
|
|
|
|
|
|
|
|
# 标题
|
|
|
|
|
steps_title = QLabel("步骤列表")
|
|
|
|
|
steps_title.setObjectName("stepsTitle")
|
|
|
|
|
header_layout.addWidget(steps_title)
|
|
|
|
|
|
|
|
|
|
# 添加步骤按钮(紧凑样式)
|
|
|
|
|
add_step_btn = QPushButton("添加步骤")
|
|
|
|
|
add_step_btn.setIcon(qta.icon('fa5s.plus', color='white'))
|
|
|
|
|
add_step_btn.setObjectName("addStepButton")
|
|
|
|
|
add_step_btn.setMaximumHeight(28) # 减小按钮高度
|
|
|
|
|
add_step_btn.clicked.connect(self.addStep)
|
|
|
|
|
header_layout.addWidget(add_step_btn)
|
|
|
|
|
|
|
|
|
|
# 删除步骤按钮(紧凑样式)
|
|
|
|
|
delete_step_btn = QPushButton("删除步骤")
|
|
|
|
|
delete_step_btn.setIcon(qta.icon('fa5s.trash', color='white'))
|
|
|
|
|
delete_step_btn.setObjectName("deleteStepButton")
|
|
|
|
|
delete_step_btn.setMaximumHeight(28) # 减小按钮高度
|
|
|
|
|
delete_step_btn.clicked.connect(self.deleteStep)
|
|
|
|
|
header_layout.addWidget(delete_step_btn)
|
|
|
|
|
|
|
|
|
|
header_layout.addStretch()
|
|
|
|
|
steps_layout.addLayout(header_layout)
|
|
|
|
|
|
|
|
|
|
# 步骤表格
|
|
|
|
|
# 步骤表格(最大化显示)
|
|
|
|
|
self.stepsTable = QTableWidget()
|
|
|
|
|
self.stepsTable.setObjectName("stepsTable") # 设置对象名称以便QSS选择器使用
|
|
|
|
|
self.stepsTable.setObjectName("stepsTable")
|
|
|
|
|
self.stepsTable.setColumnCount(6)
|
|
|
|
|
self.stepsTable.setHorizontalHeaderLabels(['序号', '步骤ID', '操作', '类型', '预期值', '备注'])
|
|
|
|
|
|
|
|
|
|
# 设置表格属性
|
|
|
|
|
self.stepsTable.setSelectionBehavior(QAbstractItemView.SelectRows)
|
|
|
|
|
self.stepsTable.setEditTriggers(QAbstractItemView.AllEditTriggers) # 允许所有方式编辑
|
|
|
|
|
self.stepsTable.setAlternatingRowColors(False)
|
|
|
|
|
self.stepsTable.setEditTriggers(QAbstractItemView.AllEditTriggers)
|
|
|
|
|
self.stepsTable.setAlternatingRowColors(True) # 启用交替行颜色
|
|
|
|
|
self.stepsTable.setShowGrid(True) # 显示网格线
|
|
|
|
|
|
|
|
|
|
# 优化表格样式
|
|
|
|
|
|
|
|
|
|
# 设置列宽
|
|
|
|
|
header = self.stepsTable.horizontalHeader()
|
|
|
|
@ -219,15 +953,12 @@ class ProcedureEditor(QWidget):
|
|
|
|
|
header.setSectionResizeMode(4, QHeaderView.ResizeToContents) # 预期值
|
|
|
|
|
header.setSectionResizeMode(5, QHeaderView.ResizeToContents) # 备注
|
|
|
|
|
|
|
|
|
|
# 设置最小列宽,确保表头显示完整
|
|
|
|
|
self.stepsTable.setColumnWidth(0, 60) # 序号
|
|
|
|
|
self.stepsTable.setColumnWidth(1, 120) # 步骤ID
|
|
|
|
|
self.stepsTable.setColumnWidth(3, 80) # 类型
|
|
|
|
|
self.stepsTable.setColumnWidth(4, 100) # 预期值
|
|
|
|
|
self.stepsTable.setColumnWidth(5, 120) # 备注
|
|
|
|
|
|
|
|
|
|
# 移除双击弹窗
|
|
|
|
|
# self.stepsTable.cellDoubleClicked.connect(self.editStep)
|
|
|
|
|
# 设置最小列宽
|
|
|
|
|
self.stepsTable.setColumnWidth(0, 50) # 序号
|
|
|
|
|
self.stepsTable.setColumnWidth(1, 100) # 步骤ID
|
|
|
|
|
self.stepsTable.setColumnWidth(3, 70) # 类型
|
|
|
|
|
self.stepsTable.setColumnWidth(4, 80) # 预期值
|
|
|
|
|
self.stepsTable.setColumnWidth(5, 100) # 备注
|
|
|
|
|
|
|
|
|
|
# 添加右键菜单
|
|
|
|
|
self.stepsTable.setContextMenuPolicy(Qt.CustomContextMenu)
|
|
|
|
@ -236,25 +967,34 @@ class ProcedureEditor(QWidget):
|
|
|
|
|
steps_layout.addWidget(self.stepsTable)
|
|
|
|
|
|
|
|
|
|
def createButtonSection(self, layout):
|
|
|
|
|
"""创建按钮区域"""
|
|
|
|
|
"""创建紧凑的按钮区域"""
|
|
|
|
|
button_widget = QWidget()
|
|
|
|
|
button_widget.setMaximumHeight(40) # 限制按钮区域高度
|
|
|
|
|
button_widget.setMinimumHeight(40)
|
|
|
|
|
|
|
|
|
|
button_layout = QHBoxLayout()
|
|
|
|
|
button_layout.setContentsMargins(8, 4, 8, 4) # 减小边距
|
|
|
|
|
button_layout.setSpacing(8) # 减小按钮间距
|
|
|
|
|
button_widget.setLayout(button_layout)
|
|
|
|
|
|
|
|
|
|
# 保存按钮
|
|
|
|
|
# 保存按钮(紧凑样式)
|
|
|
|
|
save_btn = QPushButton("保存规程")
|
|
|
|
|
save_btn.setIcon(qta.icon('fa5s.save', color='white'))
|
|
|
|
|
save_btn.setObjectName("saveProcedureButton") # 设置对象名称以便QSS选择器使用
|
|
|
|
|
save_btn.setObjectName("saveProcedureButton")
|
|
|
|
|
save_btn.setMaximumHeight(32) # 减小按钮高度
|
|
|
|
|
save_btn.clicked.connect(self.saveProcedure)
|
|
|
|
|
button_layout.addWidget(save_btn)
|
|
|
|
|
|
|
|
|
|
# 取消按钮
|
|
|
|
|
# 取消按钮(紧凑样式)
|
|
|
|
|
cancel_btn = QPushButton("取消")
|
|
|
|
|
cancel_btn.setIcon(qta.icon('fa5s.times', color='red'))
|
|
|
|
|
cancel_btn.setObjectName("cancelEditButton") # 设置对象名称以便QSS选择器使用
|
|
|
|
|
cancel_btn.setObjectName("cancelEditButton")
|
|
|
|
|
cancel_btn.setMaximumHeight(32) # 减小按钮高度
|
|
|
|
|
cancel_btn.clicked.connect(self.cancelEdit)
|
|
|
|
|
button_layout.addWidget(cancel_btn)
|
|
|
|
|
|
|
|
|
|
button_layout.addStretch()
|
|
|
|
|
layout.addLayout(button_layout)
|
|
|
|
|
button_layout.addStretch() # 将按钮推到左侧
|
|
|
|
|
layout.addWidget(button_widget)
|
|
|
|
|
|
|
|
|
|
def loadProcedureData(self):
|
|
|
|
|
"""加载规程数据"""
|
|
|
|
@ -276,7 +1016,7 @@ class ProcedureEditor(QWidget):
|
|
|
|
|
# 尝试从测试用例信息中获取描述
|
|
|
|
|
test_case_info = self.procedureData.get('测试用例信息', {})
|
|
|
|
|
description = test_case_info.get('工况描述', '')
|
|
|
|
|
self.descriptionEdit.setPlainText(description)
|
|
|
|
|
self.descriptionEdit.setText(description)
|
|
|
|
|
|
|
|
|
|
# 加载步骤数据
|
|
|
|
|
self.loadStepsData()
|
|
|
|
@ -593,7 +1333,7 @@ class ProcedureEditor(QWidget):
|
|
|
|
|
'测试用例信息': {
|
|
|
|
|
'测试用例': procedureInfo['procedureName'],
|
|
|
|
|
'用例编号': procedureInfo['procedureNumber'],
|
|
|
|
|
'工况描述': self.descriptionEdit.toPlainText()
|
|
|
|
|
'工况描述': self.descriptionEdit.text() # 修改为text(),因为现在是QLineEdit
|
|
|
|
|
},
|
|
|
|
|
'测试步骤': testSteps,
|
|
|
|
|
'updatedAt': datetime.now().isoformat()
|
|
|
|
|