199 lines
6.1 KiB
Markdown
199 lines
6.1 KiB
Markdown
# 2026-04-29 日期替代逻辑迁移与 BarcodeEditor 联动工作日报
|
||
|
||
## 工作背景
|
||
|
||
- `DateReplaceEditor` 是从 `DateVarSet` 中拆分出来的“代替”选项卡编辑器。
|
||
- 当前 UI 已经拆分完成,但原先 `DateVarSet` 中“代替”页签对应的逻辑、默认数据、以及与 `BarcodeEditor` 的联动尚未完整迁移。
|
||
- 目标是让 `DateReplaceEditor`、`DateFormatEditor` 在 `BarcodeEditor` 中成对工作,并补齐默认替换列表初始化能力。
|
||
|
||
---
|
||
|
||
## 本次完成内容
|
||
|
||
### 1. 为 DateReplaceEditor 补齐替代页数据模型接口
|
||
|
||
在 `scene/DateReplaceEditor.h/.cpp` 中补充并实现:
|
||
|
||
- `DateItemModel DateReplaceEditor::dateModel()`
|
||
- `void DateReplaceEditor::setDateModel(const DateItemModel &model)`
|
||
|
||
实现效果:
|
||
|
||
- `dateModel()`:把当前编辑器中的替代数据回收成 `DateItemModel`
|
||
- `dataMap`
|
||
- `weeksMap`
|
||
- `hoursMap`
|
||
- `monthsMap`
|
||
- `daysMap`
|
||
- `yearsMap`
|
||
- `setDateModel()`:将 `DateItemModel` 回填到编辑器内部列表,并依据当前替代类型刷新界面显示。
|
||
|
||
这样 `DateReplaceEditor` 就具备了和外部视图模型双向交换数据的能力。
|
||
|
||
---
|
||
|
||
### 2. 复刻 DateVarSet 中“代替”页默认数据初始化逻辑
|
||
|
||
在 `DateReplaceEditor` 中补齐了与 `DateVarSet::initReplaceValue()` 对应的默认初始化逻辑,包含以下替代列表:
|
||
|
||
- `dataList`:`0-9`、`A-F`
|
||
- `weekList`:`MON-SUN`
|
||
- `monthList`:`01-12`
|
||
- `dayList`:`01-31`
|
||
- `hourList`:`00-23`
|
||
- `yearList/yearInitList`:从当前年份开始连续 16 年
|
||
|
||
同时实现/整理了以下行为:
|
||
|
||
- 根据替代类型切换不同分页展示:
|
||
- 数据
|
||
- 星期
|
||
- 月
|
||
- 年
|
||
- 日
|
||
- 时
|
||
- 分页上下翻页逻辑
|
||
- 每页 4 项内容展示
|
||
- `lineEdit_Replace1~4` 文本变化实时写回对应列表
|
||
- “预设值”按钮按类型写入对应替换映射
|
||
|
||
这部分逻辑与原 `DateVarSet` 的替代页行为保持一致。
|
||
|
||
---
|
||
|
||
### 3. 在 BarcodeEditor 中补充 DateReplaceEditor 的成对增删逻辑
|
||
|
||
在 `scene/BarcodeEditor.h/.cpp` 中新增并接入:
|
||
|
||
- 成员:`DateReplaceEditor *m_dateReplaceEditor = nullptr;`
|
||
- 构造函数中实例化 `m_dateReplaceEditor`
|
||
- 析构函数中移除对应 tab 并释放对象
|
||
|
||
联动行为实现如下:
|
||
|
||
#### 当内容模板包含 `{t}` 时
|
||
|
||
动态添加两个页签:
|
||
|
||
- `DateFormatEditor` -> 标题:`日期/时间`
|
||
- `DateReplaceEditor` -> 标题:`代替`
|
||
|
||
并设置尺寸与数据同步。
|
||
|
||
#### 当内容模板不包含 `{t}` 时
|
||
|
||
动态移除上述两个页签,确保 `DateFormatEditor` 与 `DateReplaceEditor` 成对出现、成对消失。
|
||
|
||
#### 在 `bindViewModel()` 中
|
||
|
||
- 将 `m_vm->dateViewModel()` 转成 `DateFormatEditorVM` 后回填给 `DateFormatEditor`
|
||
- 将 `m_vm->dateViewModel()` 直接回填给 `DateReplaceEditor`
|
||
|
||
从而保证条码编辑器在绑定数据后,两个日期相关页签都能正确显示已有配置。
|
||
|
||
---
|
||
|
||
### 4. 打通 BarcodeEditor 中“代替”页的数据回写
|
||
|
||
在 `BarcodeEditor` 的格式确认逻辑处理中,补充了 `DateReplaceEditor` 到 `BarcodeViewModel` 的数据回写:
|
||
|
||
- 从 `m_dateReplaceEditor->dateModel()` 取出当前替代配置
|
||
- 回写到 `m_vm->dateViewModel()` 的以下字段:
|
||
- `dataMap`
|
||
- `daysMap`
|
||
- `monthsMap`
|
||
- `yearsMap`
|
||
- `weeksMap`
|
||
- `hoursMap`
|
||
|
||
同时保留 `DateFormatEditor` 对以下日期字段的同步:
|
||
|
||
- `datetimePattern`
|
||
- `daysOffset`
|
||
- `monthsOffset`
|
||
|
||
这样 `BarcodeEditor` 内部对日期格式页和日期替代页的数据已经形成完整闭环。
|
||
|
||
> 备注:后续如果 `onBtnFormatClicked()` 的业务逻辑再次调整,需要确保上述日期格式和替代数据的回写逻辑继续保留。
|
||
|
||
---
|
||
|
||
### 5. 为 DateItemModel 增加默认替代数据构造函数
|
||
|
||
在 `scene/ViewModels.h` 中为 `DateItemModel` 增加:
|
||
|
||
- `static DateItemModel createDefaultReplaceModel()`
|
||
|
||
该函数用于统一构造默认“替代”数据,初始化内容如下:
|
||
|
||
- `dataMap`:`0-9/A-F`
|
||
- `monthsMap`:`01-12`
|
||
- `daysMap`:`01-31`
|
||
- `weeksMap`:`MON-SUN`
|
||
- `hoursMap`:`00-23`
|
||
- `yearsMap`:当前年份起连续 16 年,键和值均为年份文本
|
||
|
||
其默认规则严格参考 `DateVarSet::initReplaceValue()` 的实现,作为公共默认数据来源。
|
||
|
||
---
|
||
|
||
### 6. 在 BarcodeEditor 中接入默认替代列表初始化
|
||
|
||
在 `scene/BarcodeEditor.cpp` 中,使用 `DateItemModel::createDefaultReplaceModel()` 进行了两处接入:
|
||
|
||
#### 构造函数中
|
||
|
||
- 为新创建的 `m_vm` 直接设置默认 `dateViewModel`
|
||
- 再同步给 `m_dateReplaceEditor`
|
||
|
||
目的:
|
||
|
||
- 即便外部还未绑定真实数据,`DateReplaceEditor` 也能拥有完整默认替换列表,不会出现空白替代项。
|
||
|
||
#### `bindViewModel()` 中
|
||
|
||
- 对传入的 `dateViewModel` 做兜底检查
|
||
- 若以下任意替代字段为空,则仅补齐缺失字段,而不覆盖已有数据:
|
||
- `dataMap`
|
||
- `daysMap`
|
||
- `monthsMap`
|
||
- `yearsMap`
|
||
- `weeksMap`
|
||
- `hoursMap`
|
||
|
||
目的:
|
||
|
||
- 保证已有业务数据优先
|
||
- 缺失时自动回填默认替代列表
|
||
- 避免出现部分字段为空导致编辑器显示异常的问题
|
||
|
||
---
|
||
|
||
## 涉及文件
|
||
|
||
本次涉及的主要文件:
|
||
|
||
- `scene/DateReplaceEditor.h`
|
||
- `scene/DateReplaceEditor.cpp`
|
||
- `scene/BarcodeEditor.h`
|
||
- `scene/BarcodeEditor.cpp`
|
||
- `scene/ViewModels.h`
|
||
|
||
---
|
||
|
||
## 当前结果
|
||
|
||
目前已实现:
|
||
|
||
- `DateReplaceEditor` 具备独立替代逻辑与数据模型读写能力
|
||
- `DateReplaceEditor` 与 `DateFormatEditor` 在 `BarcodeEditor` 中成对出现/删除
|
||
- `BarcodeEditor` 可同步和回写替代数据
|
||
- `DateItemModel` 可统一生成默认替代列表
|
||
- `BarcodeEditor` 已接入默认替代列表初始化和缺失字段兜底
|
||
|
||
## 后续建议
|
||
|
||
- 在真正的“确定/保存”入口统一调用 `DateFormatEditor` 与 `DateReplaceEditor` 的回写逻辑,避免后续格式按钮语义变更带来数据遗漏。
|
||
- 若后续还有其他编辑器需要复用日期默认替代列表,统一使用 `DateItemModel::createDefaultReplaceModel()`,避免重复维护多份初始化代码。
|
||
- 后续如需联调,请先修复 Qt 工程生成链路(`qmake` / `ui_*.h` / includePath / Makefile)后再进行完整编译验证。
|