单例 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
        }
    }
}
相关推荐
葡萄城技术团队4 小时前
1000 人协同压测的环境瓶颈排查:CPU 争用与 Wi\-Fi
前端
第九序言T4 小时前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
excel5 小时前
Marked 与 Markdown 有什么区别?该怎么选?
前端
龙亘川5 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
程序喵大人5 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
Da Da 泓6 小时前
五子棋 Web 端测试用例报告
前端·网络·websocket·网络协议·测试用例·项目
Raas1006 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
zxcvb1536 小时前
远程查看本地文档:一条轻量 Web 文件服务的工程化链路
前端·远程查看文档
niucloud-admin7 小时前
NIUCLOUD PHP SAAS上门家政使用文档:城市管理
java·前端·php
程序员大阳7 小时前
副队长JavaScript教程(50)-DOM:网页开发的起点
javascript·dom·es·节点·概念·document·关系