单例 QtObject 全局配置

复制代码
YourProject/
├── Main.qml               // 主页面
├── Config.qml             // 全局单例配置(核心)
├── PageA.qml              // 子页面A
├── PageB.qml              // 子页面B
└── qmldir                 // 注册单例必须

1、核心:Config.qml(单例配置对象)

使用 QtObject 存放所有全局基础属性,注册为单例,整个项目只有一份实例。

复制代码
import QtQuick 2.14
pragma Singleton

//声明为单例对象
QtObject {
    // ====================== 全局基础配置(所有页面共享) ======================
    // 主题颜色
    property color primaryColor: "#2D8CF0" // 主色
    property color warningColor: "#FF7D00" // 警告色
    property color bgColor: "#F5F7FA" // 背景色

    // 字体配置
    property int fontSizeNormal: 14
    property int fontSizeLarge: 18
    property string fontFamily: "Microsoft YaHei"

    // 尺寸配置
    property int radius: 8 // 圆角
    property int padding: 12 // 内边距

    // 业务配置
    property string apiBaseUrl: "https://api.xxx.com"
    property bool isDebug: true
    property string appVersion: "1.0.0"
    // ======================================================================
}

2、注册单例

创建单例有两种方法:

方法一:创建qmldir文件

在同一文件夹新建 qmldir,这是 QML 注册单例的固定写法:

复制代码
singleton Config 1.0 Config.qml

singleton:声明为单例

Config:单例名称(直接用这个名字访问)

1.0:版本号

Config.qml:对应文件

方法二:qmlRegisterSingletonType注册QML单例

复制代码
qmlRegisterSingletonType(QUrl("qrc:/Config.qml"), "AppConfig", 1, 0, "Config");
  • AppConfig: 为后续使用处通过import AppConfig时导入

  • Config:为后续使用控件名

3、主页面、子界面PageA、子界面PageB

主页面main.qml

复制代码
import QtQuick 2.14
import QtQuick.Layouts 1.14
import QtQuick.Window 2.14

Window {
    width: 500
    height: 300
    x: 100
    y: 100
    color: "#FFFFFF"
    visible: true
    title: "QtQbject"

    RowLayout {
        anchors.centerIn: parent
        spacing: 20

        PageA {} // 使用全局配置
        PageB {} // 使用同一个全局配置
    }

    // 测试:修改配置 → 所有页面自动同步更新
    Component.onCompleted: {
        console.log("全局主色:", Config.primaryColor)
        Config.primaryColor = "#FF4081" // 解开即可看到所有页面颜色同步变化
    }
}

子界面PageA.qml

复制代码
import QtQuick 2.14
import QtQuick.Layouts 1.14
import AppConfig 1.0

Rectangle {
    width: 200
    height: 120
    color: Config.bgColor
    radius: Config.radius

    ColumnLayout {
        anchors.centerIn: parent
        Text {
            text: "页面 A"
            color: Config.primaryColor
            font.pixelSize: Config.fontSizeLarge
            font.family: Config.fontFamily
        }
        Text {
            text: "API: " + Config.apiBaseUrl
            font.pixelSize: Config.fontSizeNormal
        }
    }
}

子界面PageB.qml

复制代码
import QtQuick 2.14
import QtQuick.Layouts 1.14
import AppConfig 1.0

Rectangle {
    width: 200
    height: 120
    color: Config.bgColor
    radius: Config.radius

    ColumnLayout {
        anchors.centerIn: parent
        Text {
            text: "页面 B"
            color: Config.warningColor
            font.pixelSize: Config.fontSizeLarge
        }
        Text {
            text: "版本: " + Config.appVersion
            font.pixelSize: Config.fontSizeNormal
        }
    }
}
相关推荐
三月微暖寻春笋几秒前
【和春笋一起学C++】(七十二)类模板
开发语言·c++·实例·类模板·使用类模板·数组模板
释厄6234 分钟前
智能体释放度子集律——文本 ⊂ 音频 ⊂ 视频⊂ 游戏
开发语言·游戏·microsoft·音视频
羲云11 分钟前
Claude 越界事件之后:Agent 权限设计为什么不能只靠提示词
前端
Sarvartha23 分钟前
Object 类
java·开发语言
行者全栈架构师25 分钟前
【鸿蒙心迹】鸿蒙网络请求架构实战——@ohos.net.http 到 Axios 封装、拦截器与统一错误处理(HarmonyOS 7.x)
前端·算法·架构
全栈Agent 小李32 分钟前
【无标题】
前端·后端·agent·ai编程·全栈·cursor·mcp
羲云32 分钟前
别让 AI 凭记忆做调研:给 WorkBuddy 接上可核验的实时搜索
前端
j7~37 分钟前
【C++ 标准项目】发布订阅消息队列 (篇七):项目创建与基础工具模块搭建
开发语言·c++·log4j·uuid·protobuf·helper工具·消息定义类型和交换机类型定义
只睡四小时39 分钟前
AI 生成 PPTX:11 页课件编译出 429 个形状
javascript·python·pptx·ai生成ppt·ooxml
leisoo809741 分钟前
股票筹码分布怎么用获利比例成本区间与集中度实战 IG50免费开源股票数据API接口
开发语言·jvm·数据库·python·开源