Files
VX5_KRO_GearPump/docs/btn_defPrintSet设计.md
T

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 文件。