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

在 Qt QML 中结合 QuickFlux(状态管理框架)与 Qt FluentUI(现代 UI 组件库)可以实现高效的状态管理和美观的界面设计。以下是实现两者协作的完整方案和代码示例:


1. 环境配置

1.1 安装依赖

  • QuickFlux:通过 qpm(Qt Package Manager)安装:
    qpm install net.quickflux
    
  • Qt FluentUI:克隆官方仓库并添加到项目路径:
    git clone https://github.com/zhuzichu520/FluentUI.git
    

    .pro 文件中导入:

    include(FluentUI/FluentUI.pri)
    

2. 结合场景:快速实现状态管理与 UI 更新

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


3. 目录结构

MyApp/
├── main.qml
├── stores/
│   └── ThemeStore.qml    # 状态存储
├── actions/
│   └── ThemeActions.qml  # 动作定义
└── components/
    ├── ThemeButton.qml   # 自定义 FluentUI 组件
    └── ...             

4. 实现步骤

4.1 定义 Action 类型

创建 actions/ThemeActions.qml 定义主题修改动作:

// actions/ThemeActions.qml
pragma Singleton
import QtQuick 2.15
import QuickFlux 1.0

ActionTypes {
    // 定义修改主题颜色的动作类型
    property string changeThemeColor: "CHANGE_THEME_COLOR"
}

4.2 实现 Store 管理状态

创建 stores/ThemeStore.qml 存储主题状态:

// stores/ThemeStore.qml
import QtQuick 2.15
import QuickFlux 1.0

Store {
    id: themeStore

    property color primaryColor: "#0067C0" // 默认 FluentUI 主题色

    // 注册 Action 处理器
    Filter {
        type: ThemeActions.changeThemeColor
        onDispatched: {
            // 接收新颜色并更新状态
            themeStore.primaryColor = message.color
        }
    }
}

4.3 封装 FluentUI 组件

创建自定义按钮组件 components/ThemeButton.qml

// components/ThemeButton.qml
import QtQuick 2.15
import FluentUI 1.0

FluButton {
    property color targetColor: "#0067C0"
    text: "切换主题色"
  
    // 点击时派发 Action 修改全局状态
    onClicked: {
        AppDispatcher.dispatch({
            type: ThemeActions.changeThemeColor,
            color: targetColor
        })
    }
}

4.4 主界面集成

main.qml 中使用 FluentUI 布局并绑定状态:

// main.qml
import QtQuick 2.15
import QtQuick.Controls 2.15
import FluentUI 1.0
import QuickFlux 1.0

ApplicationWindow {
    width: 400
    height: 300
    visible: true

    // 绑定 Store 中的主题色到 FluentUI 全局配置
    FluTheme {
        primaryColor: ThemeStore.primaryColor
    }

    Column {
        anchors.centerIn: parent
        spacing: 15

        // FluentUI 文本控件显示当前颜色
        FluText {
            text: "当前主题色: " + ThemeStore.primaryColor
            font.pixelSize: 16
        }

        // 自定义主题切换按钮
        ThemeButton {
            targetColor: "#F25022" // Microsoft Fluent 红色系
            anchors.horizontalCenter: parent.horizontalCenter
        }
    }

    // 初始化 QuickFlux AppDispatcher
    AppDispatcher { 
        dispatcherId: "main"
        bindSource: true 
    }
}

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:

// 将按钮颜色与主题状态绑定
FluButton {
    color: ThemeStore.primaryColor
    hoverColor: Qt.lighter(ThemeStore.primaryColor, 1.2)
}

6.2 异步操作处理

对于网络请求等异步场景:

// 在 ActionCreator 中处理异步逻辑
ActionCreator {
    function fetchRemoteTheme() {
        Http.get("/api/theme").then(res => {
            AppDispatcher.dispatch({
                type: ThemeActions.changeThemeColor,
                color: res.data.color
            })
        })
    }
}

6.3 多 Store 管理

当应用扩展时,分模块管理状态:

AppListener {
    // 监听全局主题变化
    Filter {
        type: ThemeActions.changeThemeColor
        onDispatched: {
            UserSettings.save("theme", message.color)
        }
    }
}

7. 调试与验证

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

8. 运行效果

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

这种结合方式可以实现:

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

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

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

来源链接:https://www.cnblogs.com/jtxs/p/18771536

请登录后发表评论

    没有回复内容