单例 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
        }
    }
}
相关推荐
Hilaku15 分钟前
从搜索排名到 AI 回答? 先聊一聊 AI 可见度工具 BuildSOM !
前端·javascript·程序员
zzmgc416 分钟前
纯静态 + Web Worker + 虚拟滚动:我是怎么让浏览器吃下 10MB JSON 不卡的
前端·架构
辰同学ovo18 分钟前
用 Chrome DevTools MCP 给 AI 写的页面做“质检“
前端·人工智能·chrome devtools
多敲代码防脱发24 分钟前
Spring进阶(容器实现)
java·开发语言·后端·spring
乌托邦25 分钟前
uni-mini-ci:让 uniapp 小程序构建后自动预览和上传
前端·vue.js·uni-app
豹哥学前端35 分钟前
前端工程化实战:从包管理到 Vite 配置,一套下来全明白
前端·javascript·vite
小新同学^O^39 分钟前
简单学习 --> 模型微调
开发语言·人工智能·python·模型微淘
网安小白39 分钟前
如果解决github域名解析问题
前端
水云桐程序员40 分钟前
C++变量的概念及用法
开发语言·c++
葬送的代码人生1 小时前
用一句 Prompt 十分钟搓出完整应用
前端·html·ai编程