PCM_Report/集成类型选择对话框.py

375 lines
12 KiB
Python
Raw 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.

"""
配置类型选择对话框集成到主程序的代码示例
"""
# ============================================================
# 1. 在文件顶部添加导入
# ============================================================
from config_type_selector import (
ConfigTypeSelectorDialog,
select_config_for_work_order,
select_config_for_settings
)
from config_category import ConfigCategory
# ============================================================
# 2. 修改"配置"按钮的点击处理
# ============================================================
def open_config_dialog(self, preview: bool = False) -> None:
"""
打开配置对话框
先让用户选择配置类型,然后打开对应的配置页面
"""
# 第一步:让用户选择配置类型
category = select_config_for_settings(self)
if category is None:
# 用户取消了选择
return
self.logger.info(f"用户选择配置类型: {category.name}")
# 第二步:加载选择的配置类型
try:
# 临时保存当前配置路径
original_autosave_path = self._autosave_path
original_config = self.config
# 加载选择的配置类型
self.config = AppConfig.load(category.config_path)
self._autosave_path = category.config_path
# 如果有模板,也加载
if category.template_path and category.template_path.exists():
self.template_path = category.template_path
self.logger.info(f"已加载配置类型 {category.name} 的配置")
except Exception as e:
self.logger.error(f"加载配置类型失败: {e}")
QMessageBox.warning(self, "错误", f"加载配置类型失败:\n{e}")
return
# 第三步:打开配置对话框(原有的配置对话框代码)
# ... 这里是原有的配置对话框代码 ...
# 注意:在对话框顶部显示当前编辑的配置类型
dlg = QDialog(self)
dlg.setWindowTitle(f"配置设置 - {category.name}") # 标题显示配置类型
dlg.resize(900, 700)
# 在对话框顶部添加配置类型提示
dlg_layout = QVBoxLayout()
# 配置类型提示标签
type_info = QLabel(f"📁 当前编辑: {category.name}")
type_info.setStyleSheet("""
QLabel {
background-color: #e3f2fd;
color: #1976d2;
padding: 10px;
border-radius: 5px;
font-size: 13px;
font-weight: bold;
}
""")
dlg_layout.addWidget(type_info)
# ... 原有的配置对话框内容 ...
# 保存按钮处理
def on_save():
try:
# 应用UI修改到配置
self.apply_ui_to_config()
# 保存到选择的配置类型文件
self.config.save(category.config_path)
self.logger.info(f"配置已保存到: {category.config_path}")
QMessageBox.information(
dlg,
"保存成功",
f"配置已保存到 {category.name}"
)
dlg.accept()
except Exception as e:
self.logger.error(f"保存配置失败: {e}")
QMessageBox.warning(dlg, "保存失败", f"保存配置失败:\n{e}")
# ... 对话框的其他代码 ...
# ============================================================
# 3. 修改"开始工单"按钮的点击处理
# ============================================================
def _start_work_order(self) -> None:
"""
开始工单
先让用户选择配置类型,然后开始工单
"""
# 第一步:让用户选择配置类型
category = select_config_for_work_order(self)
if category is None:
# 用户取消了选择
self.logger.info("用户取消了工单配置类型选择")
return
self.logger.info(f"用户为工单选择配置类型: {category.name}")
# 第二步:加载选择的配置类型
try:
self.config = AppConfig.load(category.config_path)
self._autosave_path = category.config_path
# 加载模板
if category.template_path and category.template_path.exists():
self.template_path = category.template_path
self.logger.info(f"已加载模板: {category.template_path}")
else:
self.logger.warning(f"配置类型 {category.name} 没有模板文件")
# 更新UI显示
self.apply_config_to_ui()
self.logger.info(f"已加载配置类型 {category.name}")
except Exception as e:
self.logger.error(f"加载配置类型失败: {e}")
QMessageBox.warning(self, "错误", f"加载配置类型失败:\n{e}")
return
# 第三步:弹出工单信息输入对话框
dlg = QDialog(self)
dlg.setWindowTitle(f"开始工单 - {category.name}")
dlg.resize(500, 400)
layout = QVBoxLayout()
# 显示选择的配置类型
type_info = QLabel(f"📁 配置类型: {category.name}")
type_info.setStyleSheet("""
QLabel {
background-color: #e8f5e9;
color: #2e7d32;
padding: 10px;
border-radius: 5px;
font-size: 13px;
font-weight: bold;
}
""")
layout.addWidget(type_info)
# 工单信息输入表单
form_layout = QFormLayout()
work_order_edit = QLineEdit()
work_order_edit.setPlaceholderText("请输入工单号")
form_layout.addRow("工单号:", work_order_edit)
operator_edit = QLineEdit()
operator_edit.setPlaceholderText("请输入操作员姓名")
form_layout.addRow("操作员:", operator_edit)
remark_edit = QTextEdit()
remark_edit.setPlaceholderText("请输入备注信息(可选)")
remark_edit.setMaximumHeight(100)
form_layout.addRow("备注:", remark_edit)
layout.addLayout(form_layout)
# 按钮
button_layout = QHBoxLayout()
button_layout.addStretch()
ok_btn = QPushButton("开始")
ok_btn.setStyleSheet("""
QPushButton {
background-color: #2196F3;
color: white;
padding: 8px 20px;
border-radius: 5px;
font-weight: bold;
}
QPushButton:hover {
background-color: #1976D2;
}
""")
ok_btn.clicked.connect(dlg.accept)
button_layout.addWidget(ok_btn)
cancel_btn = QPushButton("取消")
cancel_btn.clicked.connect(dlg.reject)
button_layout.addWidget(cancel_btn)
layout.addLayout(button_layout)
dlg.setLayout(layout)
# 显示对话框
if dlg.exec() != QDialog.Accepted:
return
# 获取工单信息
work_order_no = work_order_edit.text().strip()
operator = operator_edit.text().strip()
remark = remark_edit.toPlainText().strip()
if not work_order_no:
QMessageBox.warning(self, "提示", "请输入工单号")
return
# 第四步:开始工单(原有的开始工单逻辑)
try:
# 保存工单信息到全局参数
if hasattr(self.config, 'global_params'):
self.config.global_params['work_order_no'] = work_order_no
self.config.global_params['operator'] = operator
if remark:
self.config.global_params['remark'] = remark
# 保存配置类型信息
self.config.global_params['config_type'] = category.name
# 保存配置
self.config.save(category.config_path)
self.logger.info(
f"工单已开始 - 工单号: {work_order_no}, "
f"操作员: {operator}, 配置类型: {category.name}"
)
QMessageBox.information(
self,
"工单已开始",
f"工单号: {work_order_no}\n"
f"操作员: {operator}\n"
f"配置类型: {category.name}\n\n"
f"工单已开始,可以进行实验操作。"
)
# ... 原有的开始工单后续逻辑 ...
except Exception as e:
self.logger.error(f"开始工单失败: {e}")
QMessageBox.warning(self, "错误", f"开始工单失败:\n{e}")
# ============================================================
# 4. 可选:添加快速切换配置类型的功能
# ============================================================
def _quick_switch_config_type(self) -> None:
"""快速切换配置类型(不打开配置对话框)"""
category = ConfigTypeSelectorDialog.select_config_type(
parent=self,
title="切换配置类型",
message="请选择要切换到的配置类型:"
)
if category is None:
return
try:
# 保存当前配置
if self._autosave_path:
self.apply_ui_to_config()
self.config.save(self._autosave_path)
# 加载新配置
self.config = AppConfig.load(category.config_path)
self._autosave_path = category.config_path
if category.template_path:
self.template_path = category.template_path
# 更新UI
self.apply_config_to_ui()
self.logger.info(f"已切换到配置类型: {category.name}")
QMessageBox.information(
self,
"切换成功",
f"已切换到配置类型: {category.name}"
)
except Exception as e:
self.logger.error(f"切换配置类型失败: {e}")
QMessageBox.warning(self, "错误", f"切换配置类型失败:\n{e}")
# ============================================================
# 5. 完整的集成检查清单
# ============================================================
"""
集成检查清单:
□ 1. 已添加导入语句
□ 2. 已修改"配置"按钮的点击处理(先选类型,再打开配置)
□ 3. 已修改"开始工单"按钮的点击处理(先选类型,再开始工单)
□ 4. 已在配置对话框标题显示配置类型
□ 5. 已在工单对话框显示配置类型
□ 6. 已测试配置类型选择功能
□ 7. 已测试配置保存到正确的类型文件
□ 8. 已测试工单使用正确的配置类型
测试步骤:
1. 点击"配置"按钮
- 应该弹出配置类型选择对话框
- 选择一个类型后,打开该类型的配置页面
- 修改配置后保存,应该保存到该类型的文件
2. 点击"开始工单"按钮
- 应该弹出配置类型选择对话框
- 选择一个类型后,显示工单信息输入对话框
- 输入工单信息后,使用该类型的配置开始工单
3. 验证配置隔离
- 修改"600泵"的配置
- 切换到"1000泵"
- 验证"1000泵"的配置没有被影响
"""
# ============================================================
# 6. 使用示例
# ============================================================
"""
使用示例:
场景1用户点击"配置"按钮
─────────────────────────
1. 弹出配置类型选择对话框
2. 用户选择"600泵"
3. 打开"600泵"的配置页面
4. 用户修改配置
5. 保存到 configs/600泵/default.json
场景2用户点击"开始工单"按钮
─────────────────────────────
1. 弹出配置类型选择对话框
2. 用户选择"1000泵"
3. 弹出工单信息输入对话框
4. 用户输入工单号、操作员等信息
5. 使用 configs/1000泵/default.json 的配置开始工单
6. 使用 configs/1000泵/template.docx 生成报告
场景3用户需要快速切换配置类型
─────────────────────────────────
1. 添加一个"切换配置类型"按钮(可选)
2. 点击后弹出配置类型选择对话框
3. 选择后立即切换,不打开配置对话框
"""