375 lines
12 KiB
Python
375 lines
12 KiB
Python
"""
|
||
配置类型选择对话框集成到主程序的代码示例
|
||
"""
|
||
|
||
# ============================================================
|
||
# 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. 选择后立即切换,不打开配置对话框
|
||
"""
|