默认打印设置的编辑, 文件管理器不识别U盘修复、文件管理器对中文文件名的支持修复
This commit is contained in:
+32
-107
@@ -1,123 +1,48 @@
|
||||
# btn_defPrintSet 默认打印设置 实现方案
|
||||
# btn_defPrintSet 默认打印设置 实现方案(复用 InkJetPrinter 的 PrintSetting)
|
||||
|
||||
## 1. 需求
|
||||
|
||||
`MainInstruction` 中按钮 `btn_defPrintSet`,点击后弹窗编辑默认打印参数,应用后通过 `PrintSettingModel::setDefPrintSettingModel()` 持久化,启动时通过 `PrintSettingModel::defPrintSettingModel()` 加载。
|
||||
`MainInstruction` 中按钮 `btn_defPrintSet`,点击后切换到打印设置页面编辑默认参数,通过 `PrintSettingModel::setDefPrintSettingModel()` 持久化。
|
||||
|
||||
## 2. 核心思路
|
||||
|
||||
PrintSetting 已用 PrintSettingModel 抽离 sysPara,只需给它加一个"默认设置编辑模式"的标志位即可同时支持两种场景:
|
||||
复用 `InkJetPrinter::m_PrintSetting` 实例,通过 `setDefaultSettingMode(true)` 临时切换模式,关闭时恢复。
|
||||
|
||||
| 模式 | 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. 数据流
|
||||
## 3. 数据流
|
||||
|
||||
```
|
||||
btn_defPrintSet 点击
|
||||
│
|
||||
▼
|
||||
创建 QDialog 内嵌 PrintSetting
|
||||
│ setDefaultSettingMode(true)
|
||||
│ setModel(defPrintSettingModel()) ← 从 XML 加载
|
||||
│
|
||||
▼
|
||||
用户编辑控件 → 直接修改 m_model
|
||||
│
|
||||
▼
|
||||
点击"保存为默认"按钮
|
||||
│ on_pushButtonApply_pressed()
|
||||
│ → updateModelFromUI()
|
||||
│ → setDefPrintSettingModel(m_model) → 写入 XML
|
||||
│
|
||||
▼
|
||||
点击关闭按钮 → dialog.reject()
|
||||
→ MainInstruction emit sendButtonClickedSignal(6)
|
||||
→ InkJetPrinter::getMainInstructWidgetButtonClickedSlot case 6
|
||||
→ 保存当前 model:m_savedPrintSettingModel = m_PrintSetting->model()
|
||||
→ m_PrintSetting->setDefaultSettingMode(true) // 按钮文本变为"保存为默认"
|
||||
→ m_PrintSetting->setModel(defPrintSettingModel()) // 从 XML 加载
|
||||
→ m_isDefaultPrintSettingMode = true
|
||||
→ m_StackedWidget->setCurrentWidget(m_PrintSetting) // 切换到打印设置页
|
||||
|
||||
用户编辑 → 控件直接修改 m_model
|
||||
|
||||
点击"保存为默认"
|
||||
→ on_pushButtonApply_pressed
|
||||
→ 检测 m_isDefaultSettingMode → updateModelFromUI() → setDefPrintSettingModel → 写入 XML
|
||||
|
||||
点击关闭 → PrintSetting emit sendButtonClickedSignal(1)
|
||||
→ InkJetPrinter::getPrintSettingButtonClickedSlot
|
||||
→ 检测 m_isDefaultPrintSettingMode
|
||||
→ m_PrintSetting->setModel(m_savedPrintSettingModel) // 恢复
|
||||
→ m_PrintSetting->setDefaultSettingMode(false)
|
||||
→ m_isDefaultPrintSettingMode = false
|
||||
→ m_StackedWidget->setCurrentWidget(m_TestPrintWidget) // 返回
|
||||
```
|
||||
|
||||
## 5. 改动清单
|
||||
## 4. 改动清单
|
||||
|
||||
| 文件 | 改动 |
|
||||
|------|------|
|
||||
| `Printsetting.h` | 新增 `setDefaultSettingMode()` 声明 + `m_isDefaultSettingMode` 成员 |
|
||||
| `Printsetting.cpp` | 新增 `setDefaultSettingMode()` 实现,修改 `on_pushButtonApply_pressed` 分支 |
|
||||
| `MainInstruction.cpp` | 构造函数中连接 `btn_defPrintSet` 信号,创建弹窗 |
|
||||
| `MainInstruction.h` | 无需改动(lambda 内联,不需要成员) |
|
||||
| `Printsetting.h` | 新增 `setDefaultSettingMode(bool)` 声明 + `m_isDefaultSettingMode` 成员 |
|
||||
| `Printsetting.cpp` | 新增 `setDefaultSettingMode` 实现 + `on_pushButtonApply_pressed` 加分支 |
|
||||
| `MainInstruction.cpp` | btn_defPrintSet → emit sendButtonClickedSignal(6) |
|
||||
| `InkJetPrinter.h` | 新增 `m_isDefaultPrintSettingMode`、`m_savedPrintSettingModel`、`enterDefaultPrintSettingMode()`、`exitDefaultPrintSettingMode()` |
|
||||
| `InkJetPrinter.cpp` | 实现进入/退出默认模式逻辑,getMainInstructWidgetButtonClickedSlot 加 case 6,getPrintSettingButtonClickedSlot 加恢复逻辑 |
|
||||
|
||||
## 6. 关于复用 InkJetPrinter 中已有 PrintSetting 实例
|
||||
|
||||
**不建议复用**。原因:
|
||||
|
||||
- `m_PrintSetting` 已通过 `bindSysPara(para)` 绑定硬件,位于 `m_StackedWidget` 页面中
|
||||
- 复用需要:保存/恢复 model + 切换模式 + 区分 `sendButtonClickedSignal` 的两种语义
|
||||
- 新建一个不绑 sysPara 的临时 `PrintSetting` 成本极低(等同于 QWidget),用完即销毁,代码清晰不侵入 InkJetPrinter
|
||||
|
||||
## 7. 不需要新建任何文件
|
||||
|
||||
改动集中在 3 个文件,无需新建类或 ui 文件。
|
||||
## 5. 不需要新建任何文件
|
||||
Reference in New Issue
Block a user