实现设置页设备管理 UI 与事件接口 #5

Closed
opened 2026-08-06 15:26:28 +08:00 by ila · 5 comments
Owner

基本信息

  • 类型:需求
  • 父级大工单:#1
  • 所属 MVP / 版本:#2 / MVP
  • 阶段:1. UI 与工程骨架

要解决什么

当前设备管理仍是独立导航页,只包含无线地址和连接按钮;设置页还是占位卡片。需要按已确认方案把设备管理并入设置页,提供“当前设备”和“Android 设备”两组界面,并为后续设备号、SQLite 和 ADB 服务提供稳定事件接口。

做什么 / 不做什么

  • 做:
    • 在 client/src/settings_ui.py 实现当前设备信息、Android 地址、命令栏和设备表格;
    • 设备表格左侧提供互斥勾选,同一时间最多勾选一台;
    • 在 client/src/settings_ui_event.py 绑定搜索、连接、保存、删除及表格勾选事件;
    • 页面通过信号和更新方法接收后续后台服务结果,不在 UI 中执行 ADB 或 SQLite;
    • 在 client/src/ui_main.py 移除独立设备导航,只保留“PDD 任务”和“设置”。
  • 不做:
    • 不实现真实 ADB 搜索、连接或断开;
    • 不生成真实设备号,不读系统硬件参数;
    • 不接入 SQLite,不持久化设备名或已选 Android 设备;
    • 不修改 PDD 任务页及用户已有无关改动。

怎么做

  1. 使用 PyQt5、Qt Widgets 和 PyQt-Fluent-Widgets 建立可滚动的设置页。
  2. “当前设备”组显示只读设备号和可编辑设备名,初始设备号为“待生成”。
  3. “Android 设备”组包含无线地址输入框、搜索/连接/保存/删除按钮和 Model/View 表格。
  4. 表格模型使用 Android 序列号作为稳定身份,区分当前行与待保存勾选;勾选互斥。
  5. SettingsPageEventBinder 负责组件事件绑定并发出轻量信号,提供忙碌、设备列表和已保存设备的 UI 更新入口。
  6. 删除当前选择只发出请求;真实 USB/Wi-Fi 删除语义由后续 ADB 服务工单完成。
  7. 保留用户已在 ui_main.py 修改的窗口标题和 PDD 导航文案,仅移除设备页面装配。

预计修改文件:

  • client/src/settings_ui.py
  • client/src/settings_ui_event.py
  • client/src/ui_main.py

验收标准

  • 主窗口只显示“PDD 任务”和“设置”两个顶级导航项;
  • 设置页包含“当前设备”和“Android 设备”两组;
  • 当前设备组包含只读设备号和可编辑设备名;
  • Android 设备组包含无线地址、搜索、连接、保存和删除按钮;
  • 设备表格显示勾选、设备号、连接方式、型号、Android 版本和状态;
  • 表格使用 TableView + QAbstractTableModel,最多勾选一台设备;
  • 搜索、连接、保存、删除事件由 settings_ui_event.py 绑定并发出信号;
  • 空设备列表时表格和表头保持显示;
  • Android 设备列表无真实设备时,根据表格可视高度用不可交互空行填满,且不产生无意义的垂直滚动条;
  • 文件通过语法检查,MainWindow 离屏装配及事件测试通过;
  • 未执行真实 ADB、SQLite、硬件指纹或 Android 设备操作。

怎么验证

从 client/ 目录执行:

C:/Python310/python.exe -m py_compile src/settings_ui.py src/settings_ui_event.py src/ui_main.py

离屏创建 SettingsPage 和 MainWindow,注入 USB/Wi-Fi 模拟设备,验证互斥勾选、按钮事件信号、空表格和导航项数量。

风险和回退

主要风险是与用户尚未提交的 ui_main.py 文案修改重叠。实现时只移除设备页面导入、实例化和导航,不覆盖窗口标题与其他导航文案;需要回退时只回退本工单提交。

## 基本信息 - 类型:需求 - 父级大工单:#1 - 所属 MVP / 版本:#2 / MVP - 阶段:1. UI 与工程骨架 ## 要解决什么 当前设备管理仍是独立导航页,只包含无线地址和连接按钮;设置页还是占位卡片。需要按已确认方案把设备管理并入设置页,提供“当前设备”和“Android 设备”两组界面,并为后续设备号、SQLite 和 ADB 服务提供稳定事件接口。 ## 做什么 / 不做什么 - 做: - 在 `client/src/settings_ui.py` 实现当前设备信息、Android 地址、命令栏和设备表格; - 设备表格左侧提供互斥勾选,同一时间最多勾选一台; - 在 `client/src/settings_ui_event.py` 绑定搜索、连接、保存、删除及表格勾选事件; - 页面通过信号和更新方法接收后续后台服务结果,不在 UI 中执行 ADB 或 SQLite; - 在 `client/src/ui_main.py` 移除独立设备导航,只保留“PDD 任务”和“设置”。 - 不做: - 不实现真实 ADB 搜索、连接或断开; - 不生成真实设备号,不读系统硬件参数; - 不接入 SQLite,不持久化设备名或已选 Android 设备; - 不修改 PDD 任务页及用户已有无关改动。 ## 怎么做 1. 使用 PyQt5、Qt Widgets 和 PyQt-Fluent-Widgets 建立可滚动的设置页。 2. “当前设备”组显示只读设备号和可编辑设备名,初始设备号为“待生成”。 3. “Android 设备”组包含无线地址输入框、搜索/连接/保存/删除按钮和 Model/View 表格。 4. 表格模型使用 Android 序列号作为稳定身份,区分当前行与待保存勾选;勾选互斥。 5. `SettingsPageEventBinder` 负责组件事件绑定并发出轻量信号,提供忙碌、设备列表和已保存设备的 UI 更新入口。 6. 删除当前选择只发出请求;真实 USB/Wi-Fi 删除语义由后续 ADB 服务工单完成。 7. 保留用户已在 `ui_main.py` 修改的窗口标题和 PDD 导航文案,仅移除设备页面装配。 预计修改文件: - `client/src/settings_ui.py` - `client/src/settings_ui_event.py` - `client/src/ui_main.py` ## 验收标准 - [x] 主窗口只显示“PDD 任务”和“设置”两个顶级导航项; - [x] 设置页包含“当前设备”和“Android 设备”两组; - [x] 当前设备组包含只读设备号和可编辑设备名; - [x] Android 设备组包含无线地址、搜索、连接、保存和删除按钮; - [x] 设备表格显示勾选、设备号、连接方式、型号、Android 版本和状态; - [x] 表格使用 `TableView + QAbstractTableModel`,最多勾选一台设备; - [x] 搜索、连接、保存、删除事件由 `settings_ui_event.py` 绑定并发出信号; - [x] 空设备列表时表格和表头保持显示; - [x] Android 设备列表无真实设备时,根据表格可视高度用不可交互空行填满,且不产生无意义的垂直滚动条; - [x] 文件通过语法检查,MainWindow 离屏装配及事件测试通过; - [x] 未执行真实 ADB、SQLite、硬件指纹或 Android 设备操作。 ## 怎么验证 从 `client/` 目录执行: ```powershell C:/Python310/python.exe -m py_compile src/settings_ui.py src/settings_ui_event.py src/ui_main.py ``` 离屏创建 `SettingsPage` 和 `MainWindow`,注入 USB/Wi-Fi 模拟设备,验证互斥勾选、按钮事件信号、空表格和导航项数量。 ## 风险和回退 主要风险是与用户尚未提交的 `ui_main.py` 文案修改重叠。实现时只移除设备页面导入、实例化和导航,不覆盖窗口标题与其他导航文案;需要回退时只回退本工单提交。
Author
Owner

状态:进行中。已同步到 Epic #1 和 MVP #2。本工单只实现 UI、互斥勾选模型、事件接口和导航合并,不执行真实 ADB、SQLite 或硬件信息读取。

状态:进行中。已同步到 Epic #1 和 MVP #2。本工单只实现 UI、互斥勾选模型、事件接口和导航合并,不执行真实 ADB、SQLite 或硬件信息读取。
Author
Owner

实施完成,等待用户验收

最终实现

  • 设备管理已并入设置页,包含“当前设备”和“Android 设备”两组;
  • 当前设备提供只读设备号和可编辑设备名;
  • Android 设备提供无线地址、搜索、连接、保存、删除和六列表格;
  • 表格使用 TableView + QAbstractTableModel,设备勾选按序列号互斥;
  • 四类操作统一由 settings_ui_event.py 绑定并发出轻量信号;
  • 独立设备导航已移除,主窗口只装配 PDD 任务与设置;
  • 没有执行真实 ADB、SQLite 或硬件信息读取。

验证

  • 语法检查:通过;
  • USB、Wi-Fi、离线模拟设备及互斥勾选:通过;
  • 搜索、连接、保存、删除信号:通过;
  • 空表格和 MainWindow 装配:通过;
  • 离屏测试输出:SETTINGS_DEVICE_UI_OK;
  • 已知 PyQt5 字体目录警告不影响断言。

提交与归档

  • 实现提交:41f7cbb
  • 归档提交:665eddb
  • 本地归档:docs/task/5-实现设置页设备管理-ui-与事件接口.md

工单保持打开,等待用户验收。真实设备号、持久化和 ADB 后台服务按后续单元任务实现。

## 实施完成,等待用户验收 ### 最终实现 - 设备管理已并入设置页,包含“当前设备”和“Android 设备”两组; - 当前设备提供只读设备号和可编辑设备名; - Android 设备提供无线地址、搜索、连接、保存、删除和六列表格; - 表格使用 `TableView + QAbstractTableModel`,设备勾选按序列号互斥; - 四类操作统一由 `settings_ui_event.py` 绑定并发出轻量信号; - 独立设备导航已移除,主窗口只装配 PDD 任务与设置; - 没有执行真实 ADB、SQLite 或硬件信息读取。 ### 验证 - 语法检查:通过; - USB、Wi-Fi、离线模拟设备及互斥勾选:通过; - 搜索、连接、保存、删除信号:通过; - 空表格和 MainWindow 装配:通过; - 离屏测试输出:`SETTINGS_DEVICE_UI_OK`; - 已知 PyQt5 字体目录警告不影响断言。 ### 提交与归档 - 实现提交:`41f7cbb` - 归档提交:`665eddb` - 本地归档:`docs/task/5-实现设置页设备管理-ui-与事件接口.md` 工单保持打开,等待用户验收。真实设备号、持久化和 ADB 后台服务按后续单元任务实现。
Author
Owner

收到补充验收项:Android 设备表格在无数据时按可视高度填充不可交互空行;真实设备数据仍按实际条数显示。本次仅调整 client/src/settings_ui.py,不覆盖工作区其他未提交修改。

收到补充验收项:Android 设备表格在无数据时按可视高度填充不可交互空行;真实设备数据仍按实际条数显示。本次仅调整 `client/src/settings_ui.py`,不覆盖工作区其他未提交修改。
Author
Owner

补充验收项已完成

  • 无设备时按表格可视高度填充不可交互空行;
  • 表格高度从默认值增加后,占位行由 5 行自动增加到 9 行;
  • 占位行不可选择、不可勾选、不可编辑;
  • 真实设备数据到达后,仅显示实际设备行;清空数据后恢复占位行;
  • 空状态无多余垂直滚动条。

验证输出:ANDROID_EMPTY_GRID_OK、ANDROID_EMPTY_GRID_RESIZE_OK before=5 after=9。PyQt5 字体目录警告为既有环境提示,不影响断言。

提交:实现 1bc597f,归档 f6da836。工单继续保持打开,等待用户验收。

## 补充验收项已完成 - 无设备时按表格可视高度填充不可交互空行; - 表格高度从默认值增加后,占位行由 5 行自动增加到 9 行; - 占位行不可选择、不可勾选、不可编辑; - 真实设备数据到达后,仅显示实际设备行;清空数据后恢复占位行; - 空状态无多余垂直滚动条。 验证输出:`ANDROID_EMPTY_GRID_OK`、`ANDROID_EMPTY_GRID_RESIZE_OK before=5 after=9`。PyQt5 字体目录警告为既有环境提示,不影响断言。 提交:实现 `1bc597f`,归档 `f6da836`。工单继续保持打开,等待用户验收。
Author
Owner

用户已确认 PDD 任务与参数设置 UI 验收通过。本工单验收完成,现关闭。

用户已确认 PDD 任务与参数设置 UI 验收通过。本工单验收完成,现关闭。
ila closed this issue 2026-08-06 16:01:11 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#5