# btn_defPrintSet 默认打印设置 实现方案 ## 1. 需求 `MainInstruction` 中按钮 `btn_defPrintSet`,点击后弹窗编辑默认打印参数,应用后通过 `PrintSettingModel::setDefPrintSettingModel()` 持久化,启动时通过 `PrintSettingModel::defPrintSettingModel()` 加载。 ## 2. 核心思路 PrintSetting 已用 PrintSettingModel 抽离 sysPara,只需给它加一个"默认设置编辑模式"的标志位即可同时支持两种场景: | 模式 | apply 行为 | |------|-----------| | 普通模式(默认) | `updateModelFromUI()` → `applyToSysPara(sysPara)` → 写硬件 | | 默认设置编辑模式 | `updateModelFromUI()` → `setDefPrintSettingModel(m_model)` → 写 XML | ## 3. 修改点 ### 3.1 PrintSetting.h — 新增声明 ```cpp // 公开方法 void setDefaultSettingMode(bool enable); // 设为 true 进入默认设置编辑模式 // 私有成员 bool m_isDefaultSettingMode = false; // 模式标志 ``` ### 3.2 PrintSetting.cpp — 新增实现 ```cpp void PrintSetting::setDefaultSettingMode(bool enable) { m_isDefaultSettingMode = enable; if (enable) { // 文本可改为"保存为默认" m_checkBtn->setText(tr("保存为默认")); } } void PrintSetting::on_pushButtonApply_pressed() { if (m_isDefaultSettingMode) { updateModelFromUI(); PrintSettingModel::setDefPrintSettingModel(m_model); QMessageBox::information(nullptr, tr("提示"), tr("默认设置已保存")); } else { applyPrintSettingsToSysPara(true); } } ``` ### 3.3 MainInstruction — 按钮连接 `MainInstruction.cpp` 构造函数中: ```cpp #include "Printsetting.h" // 连接 btn_defPrintSet connect(ui->btn_defPrintSet, &QPushButton::clicked, this, [this]() { QDialog dlg(this); dlg.setWindowTitle(tr("默认打印设置")); dlg.resize(800, 600); PrintSetting* ps = new PrintSetting(&dlg); ps->setDefaultSettingMode(true); ps->setModel(PrintSettingModel::defPrintSettingModel()); // 关闭按钮 → 关闭弹窗 connect(ps, &PrintSetting::sendButtonClickedSignal, &dlg, &QDialog::reject); QVBoxLayout* layout = new QVBoxLayout(&dlg); layout->addWidget(ps); dlg.setLayout(layout); dlg.exec(); }); ``` ## 4. 数据流 ``` btn_defPrintSet 点击 │ ▼ 创建 QDialog 内嵌 PrintSetting │ setDefaultSettingMode(true) │ setModel(defPrintSettingModel()) ← 从 XML 加载 │ ▼ 用户编辑控件 → 直接修改 m_model │ ▼ 点击"保存为默认"按钮 │ on_pushButtonApply_pressed() │ → updateModelFromUI() │ → setDefPrintSettingModel(m_model) → 写入 XML │ ▼ 点击关闭按钮 → dialog.reject() ``` ## 5. 改动清单 | 文件 | 改动 | |------|------| | `Printsetting.h` | 新增 `setDefaultSettingMode()` 声明 + `m_isDefaultSettingMode` 成员 | | `Printsetting.cpp` | 新增 `setDefaultSettingMode()` 实现,修改 `on_pushButtonApply_pressed` 分支 | | `MainInstruction.cpp` | 构造函数中连接 `btn_defPrintSet` 信号,创建弹窗 | | `MainInstruction.h` | 无需改动(lambda 内联,不需要成员) | ## 6. 关于复用 InkJetPrinter 中已有 PrintSetting 实例 **不建议复用**。原因: - `m_PrintSetting` 已通过 `bindSysPara(para)` 绑定硬件,位于 `m_StackedWidget` 页面中 - 复用需要:保存/恢复 model + 切换模式 + 区分 `sendButtonClickedSignal` 的两种语义 - 新建一个不绑 sysPara 的临时 `PrintSetting` 成本极低(等同于 QWidget),用完即销毁,代码清晰不侵入 InkJetPrinter ## 7. 不需要新建任何文件 改动集中在 3 个文件,无需新建类或 ui 文件。