找回密码
 立即注册
首页 业界区 安全 QT QML 使用 QuickFlux 和 Qt FluentUI 整合集成

QT QML 使用 QuickFlux 和 Qt FluentUI 整合集成

嘀荼酴 2025-6-1 20:52:53
在 Qt QML 中结合 QuickFlux(状态管理框架)与 Qt FluentUI(现代 UI 组件库)可以实现高效的状态管理和美观的界面设计。以下是实现两者协作的完整方案和代码示例:
1. 环境配置

1.1 安装依赖


  • QuickFlux:通过 qpm(Qt Package Manager)安装:
    1. qpm install net.quickflux
    复制代码
  • Qt FluentUI:克隆官方仓库并添加到项目路径:
    1. git clone https://github.com/zhuzichu520/FluentUI.git
    复制代码
    在 .pro 文件中导入:
    1. include(FluentUI/FluentUI.pri)
    复制代码
2. 结合场景:快速实现状态管理与 UI 更新

示例目标:通过 FluentUI 按钮修改全局主题色,用 QuickFlux 同步状态。

3. 目录结构
  1. MyApp/
  2. ├── main.qml
  3. ├── stores/
  4. │   └── ThemeStore.qml    # 状态存储
  5. ├── actions/
  6. │   └── ThemeActions.qml  # 动作定义
  7. └── components/
  8.     ├── ThemeButton.qml   # 自定义 FluentUI 组件
  9.     └── ...            
复制代码
4. 实现步骤

4.1 定义 Action 类型

创建 actions/ThemeActions.qml 定义主题修改动作:
  1. // actions/ThemeActions.qml
  2. pragma Singleton
  3. import QtQuick 2.15
  4. import QuickFlux 1.0
  5. ActionTypes {
  6.     // 定义修改主题颜色的动作类型
  7.     property string changeThemeColor: "CHANGE_THEME_COLOR"
  8. }
复制代码
4.2 实现 Store 管理状态

创建 stores/ThemeStore.qml 存储主题状态:
  1. // stores/ThemeStore.qml
  2. import QtQuick 2.15
  3. import QuickFlux 1.0
  4. Store {
  5.     id: themeStore
  6.     property color primaryColor: "#0067C0" // 默认 FluentUI 主题色
  7.     // 注册 Action 处理器
  8.     Filter {
  9.         type: ThemeActions.changeThemeColor
  10.         onDispatched: {
  11.             // 接收新颜色并更新状态
  12.             themeStore.primaryColor = message.color
  13.         }
  14.     }
  15. }
复制代码
4.3 封装 FluentUI 组件

创建自定义按钮组件 components/ThemeButton.qml:
  1. // components/ThemeButton.qml
  2. import QtQuick 2.15
  3. import FluentUI 1.0
  4. FluButton {
  5.     property color targetColor: "#0067C0"
  6.     text: "切换主题色"
  7.   
  8.     // 点击时派发 Action 修改全局状态
  9.     onClicked: {
  10.         AppDispatcher.dispatch({
  11.             type: ThemeActions.changeThemeColor,
  12.             color: targetColor
  13.         })
  14.     }
  15. }
复制代码
4.4 主界面集成

在 main.qml 中使用 FluentUI 布局并绑定状态:
  1. // main.qml
  2. import QtQuick 2.15
  3. import QtQuick.Controls 2.15
  4. import FluentUI 1.0
  5. import QuickFlux 1.0
  6. ApplicationWindow {
  7.     width: 400
  8.     height: 300
  9.     visible: true
  10.     // 绑定 Store 中的主题色到 FluentUI 全局配置
  11.     FluTheme {
  12.         primaryColor: ThemeStore.primaryColor
  13.     }
  14.     Column {
  15.         anchors.centerIn: parent
  16.         spacing: 15
  17.         // FluentUI 文本控件显示当前颜色
  18.         FluText {
  19.             text: "当前主题色: " + ThemeStore.primaryColor
  20.             font.pixelSize: 16
  21.         }
  22.         // 自定义主题切换按钮
  23.         ThemeButton {
  24.             targetColor: "#F25022" // Microsoft Fluent 红色系
  25.             anchors.horizontalCenter: parent.horizontalCenter
  26.         }
  27.     }
  28.     // 初始化 QuickFlux AppDispatcher
  29.     AppDispatcher {
  30.         dispatcherId: "main"
  31.         bindSource: true
  32.     }
  33. }
复制代码
5. 核心协作流程

sequenceDiagram    participant UI as FluentUI 组件    participant Dispatcher as QuickFlux Dispatcher    participant Store as ThemeStore    participant Theme as FluTheme    UI->>Dispatcher: 用户点击按钮 -> 触发 onClicked    Dispatcher->>Store: 派发 Action (type=CHANGE_THEME_COLOR)    Store-->>UI: 更新 primaryColor 属性    Theme-->>UI: 所有绑定 FluTheme.primaryColor 的组件自动刷新6. 关键优化技巧

6.1 响应式主题切换

动态绑定 FluentUI 组件属性到 Store:
  1. // 将按钮颜色与主题状态绑定
  2. FluButton {
  3.     color: ThemeStore.primaryColor
  4.     hoverColor: Qt.lighter(ThemeStore.primaryColor, 1.2)
  5. }
复制代码
6.2 异步操作处理

对于网络请求等异步场景:
  1. // 在 ActionCreator 中处理异步逻辑
  2. ActionCreator {
  3.     function fetchRemoteTheme() {
  4.         Http.get("/api/theme").then(res => {
  5.             AppDispatcher.dispatch({
  6.                 type: ThemeActions.changeThemeColor,
  7.                 color: res.data.color
  8.             })
  9.         })
  10.     }
  11. }
复制代码
6.3 多 Store 管理

当应用扩展时,分模块管理状态:
  1. AppListener {
  2.     // 监听全局主题变化
  3.     Filter {
  4.         type: ThemeActions.changeThemeColor
  5.         onDispatched: {
  6.             UserSettings.save("theme", message.color)
  7.         }
  8.     }
  9. }
复制代码
7. 调试与验证


  • 调试 QuickFlux:通过 AppDispatcher.logging = true 输出 Action 数据流:
    1. AppDispatcher { logging: true }
    复制代码
  • FluentUI 样式检查:使用 Qt Creator 的 Live Preview 实时查看组件样式更新。
8. 运行效果


  • 点击按钮后,所有绑定了 FluTheme.primaryColor 的组件(导航栏、按钮、文本等)会自动更新为新的主题色。
  • 通过 QuickFlux 的单向数据流,确保状态变化的可追溯性。
这种结合方式可以实现:

逻辑与UI分离 - 用 QuickFlux 管理复杂状态

高度可维护性 - FluentUI 提供一致的设计语言

动态响应能力 - QML 的绑定机制实现零手动刷新

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册