单例 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
        }
    }
}
相关推荐
橙子家13 小时前
浏览器缓存之【基础键值存储】:Local storage 和 Session storage
前端
星星在线16 小时前
MusicFree:一个「All in One」的个人音乐服务器,让听歌回归简单
前端·后端
IT_陈寒17 小时前
Redis的SETNX并发问题让我加了三天班
前端·人工智能·后端
demo007x17 小时前
Docling 文档转换以及技术架构分析
前端·后端·程序员
京东云开发者18 小时前
京东市民服务又“上新”!这次是黑龙江“龙易办”
前端
袋鱼不重18 小时前
我的神奇同事,AI 用多了居然写了个 Open In Codex
前端·后端·ai编程
竹林81818 小时前
Web3表单签名验证:我用 wagmi 和 ethers 给 DApp 加了一个“免密登录”,踩坑记录全在这了
javascript
用户69903048487519 小时前
try catch使用场景 处理同步代码错误兼容用的
javascript·uni-app
LDR00619 小时前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术19 小时前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript