3.6 KiB
3.6 KiB
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 — 新增声明
// 公开方法
void setDefaultSettingMode(bool enable); // 设为 true 进入默认设置编辑模式
// 私有成员
bool m_isDefaultSettingMode = false; // 模式标志
3.2 PrintSetting.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 构造函数中:
#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 文件。