如何为QML创建动态的全局主题?

时间:2018-09-18 13:52:51

标签: qml

这篇文章declare global property in QML for other QML files很好地展示了如何创建全局主题,但是您将如何创建一个可以由用户轻松切换的主题?我想您可能需要一些全局信号来告诉组件更改的值,但是该值已经在对象中隐含了吗?

例如,我想做的是拥有一种看起来像这样的样式:

pragma Singleton
import QtQuick 2.2


var boolean darkTheme = true;

function employDarkTheme() {
    darkTheme = true;
}

function employLightTheme() {
    darkTheme = false;
}

QtObject {

    property QtObject font: QtObject {
        property QtObject pointSize: QtObject {
            property int menu: 10
            property int normal: 12
            property int subTitle: 18
            property int title: 24
        }
        property QtObject color: QtObject {
            property color primary: darkTheme ? "black" : "white"
            property color secondary: darkTheme ? "white" : "black"
        }
    }

    property QtObject background: QtObject {
        property QtObject color: QtObject {
            property color primary: darkTheme ? "#333333" : "white"
            property color secondary: darkTheme ? "white" : "#333333"
        }
    }
}

QML当前的工作方式是否可能发生这种情况?

1 个答案:

答案 0 :(得分:1)

玩了一点之后,实际上是有可能而且很容易做到的。如果使用以下代码代替以前的代码,则使用:

pragma Singleton
import QtQuick 2.2

QtObject {
    property var darkTheme: true

    property QtObject font: QtObject {
        property QtObject pointSize: QtObject {
            property int menu: 10
            property int normal: 12
            property int subTitle: 18
            property int title: 24
        }
        property QtObject color: QtObject {
            property color primary: darkTheme ? "black" : "white"
            property color secondary: darkTheme ? "white" : "black"
        }
    }

    property QtObject background: QtObject {
        property QtObject color: QtObject {
            property color primary: darkTheme ? "#333333" : "white"
            property color secondary: darkTheme ? "white" : "#333333"
        }
    }
}

并随时更改darkTheme,它将更改对象,激活信号/插槽并更改整个应用程序。