Skip to content

# [Refactor] 重构架构:引入 Controller 与 Adapter 模式实现 UI/逻辑解耦Update gitignore#8

Draft
703519523 wants to merge 15 commits into
mainfrom
refactor/mvvm-structure
Draft

# [Refactor] 重构架构:引入 Controller 与 Adapter 模式实现 UI/逻辑解耦Update gitignore#8
703519523 wants to merge 15 commits into
mainfrom
refactor/mvvm-structure

Conversation

@703519523

Copy link
Copy Markdown
Owner

背景 (Background)

当前项目的核心类 EmoteWidget 是一个典型的上帝类 (God Class),它继承自 QWebEngineView
目前,所有的业务逻辑(插件系统、口型同步、配置管理、通信桥梁)都与具体的 UI 实现(QWidget/QWebEngineView)深度绑定。

问题 (Problem)

  1. 高耦合 (Tight Coupling):业务逻辑无法脱离 QWebEngineView 独立运行。
  2. 扩展性差 (Poor Extensibility):项目计划引入 QML 作为现代化前端,甚至未来可能迁移至其他 Web 容器框架。目前的继承式架构导致无法复用现有的 Python 逻辑。
  3. 难以维护 (Maintenance Debt):单文件代码量过大,职责不单一,修改 UI 代码容易破坏业务逻辑。

解决方案 (Proposed Solution)

采用 MVVM 思想配合 Adapter (适配器) 模式进行重构。

架构设计

  1. 核心控制器 (EmoteController)

    • QObject 类,不依赖任何 GUI 库
    • 负责:配置管理 (Config), 插件加载 (PluginLoader), 音频处理 (LipSync), JS 指令生成。
    • 它只负责“决定做什么”,不负责“怎么显示”。
  2. 适配器层 (adapters/)

    • 定义一个抽象基类/接口,规范 run_js, register_channel 等行为。
    • WidgetAdapter:封装 QWebEngineView 的具体实现。
    • QmlAdapter:封装 QML WebEngineView 的具体实现。
    • (Future) OtherAdapter:预留给未来可能使用的其他框架。
  3. 通信层 (Bridge)

    • _PythonApiBridge 彻底独立,使其能被注入到任何适配器中。

预期收益 (Benefits)

  • 架构解耦:业务逻辑与 UI 框架无关,便于编写单元测试。
  • 多端支持:一套核心代码同时支持 QWidget, QML 或其他 Python Web 框架。
  • 降低风险:通过 Adapter 隔离变化,UI 层的升级不会影响核心业务。

Resolves #7

@703519523 703519523 self-assigned this Feb 7, 2026
@703519523 703519523 added the enhancement New feature or request label Feb 7, 2026
**主要变更:**

*   **核心功能:** 新增 `render.quality` 配置选项,支持 "low" (1.0x)、"high" (2.0x)、"ultra" (4.0x) 和 "auto" (基于系统 DPI) 四种模式。
*   **控制器:** 在 `EmoteController` 中实现了 `set_render_quality(mode)` API,并通过 `EmoteWidgetQml` 暴露给前端,支持运行时动态切换。
*   **前端 (JS):**
    *   重构了 `pyside_webview.html`,通过 `currentScaleFactor` 支持动态分辨率缩放。
    *   修复了 `isOverCharacter` 点击检测逻辑,确保在不同渲染分辨率下能正确映射鼠标坐标。
*   **驱动修改 (`emoteplayer.js`):**
    *   实现了 `EmoteDevice.prototype.onResize` 方法,用于在画布尺寸变更时正确更新内部 C++ 缓冲区、渲染纹理和 WebGL 视口。
    *   修改了 `EmotePlayer.createRenderCanvas`,现在会复用现有的画布元素并触发新的缩放逻辑,从而防止上下文丢失和视口错位。
*   **开发工具:**
    *   更新了 `test_qt.py`,在“外观”标签页中添加了渲染画质选择器。
    *   更新了 QML 测试器 (`ControlPanel.qml`, `main.qml`),加入了渲染画质控制功能。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Refactor] 架构重构:分离业务逻辑与UI,实现 MVVM 模式以支持 QML

1 participant