c++ - 使用 C++ 更改 QML 单例的属性

标签 c++ qt singleton qml qtquick2

我正在实现一个类似 Ubuntu Touch 的简化调色板(不是每个元素的调色板)。

有一个 GlobalPaletteSetting 单例:

pragma Singleton

import QtQuick 2.5

QtObject {
    property Palette current: NonePalette {}
}

和一些调色板类,如 NonePaletteDark:

Palette {
    normal: PaletteValues {
        background: "white"
        backgroundText: "black"
        base: "white"
        baseText: "black"
        foreground: "white"
        foregroundText: "black"
        overlay: "white"
        overlayText: "black"
        field: "white"
        fieldText: "black"
        selection: "pink"
    }
}

因此,可以在 QML 中更改全局调色板:

import "Customization/Palettes/Dark"

//...

DarkPalette {
    id: dark
}

Component.onCompleted: {
    GlobalPaletteSetting.current = dark
}

我想通过设置环境变量来设置全局调色板。就像 QtQuick 样式正在工作一样。

因此,需要从 C++ 访问 GlobalPaletteSetting。还有一种使用调色板加载 QML 文件并设置 GlobalPaletteSetting.current 的方法。

怎么做?

最佳答案

这是我想出的代码:

QQmlComponent component(engine());
const char *source =
        "import QtQuick 2.0\n"
        "import Components 1.0\n"
        "QtObject {\n"
        "    property var style: CustomStyle\n"
        "    function setColor(c) { CustomStyle.headerColor = c; }\n"
        "}";
component.setData(source, QUrl());
QObject *item = component.create();
QObject *style = qvariant_cast<QObject*>(item->property("style"));
style->setProperty("headerColor", QColor(255, 0, 0));

这里,CustomStyle 是我的样式定义,一个单例。您可以在 https://goo.gl/ItJGIf 找到完整的示例

使用 objectName 的建议对我不起作用 - 无论我将它放在单例组件的顶层,还是放在子项中,findChild 都会返回 0 . 它也不适用于常规组件的顶层,仅适用于其子组件。你可以在 https://goo.gl/Iqj9Ap 找到我的尝试

关于你的第二个问题,关于在运行时加载你的样式定义,你可以调整上面的代码 - 使用 setDataloadUrl 来加载组件定义,使用 create 创建实例,然后设置实例。事实上,您可以执行 engine()->rootContext()->setContextProperty("style", ...) 这样 QML 中的所有内容都可以访问“style”变量,这可能更容易比有一个单例。

关于c++ - 使用 C++ 更改 QML 单例的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32472462/

相关文章:

c++ - Qt 将几何图形设置为新创建的小部件

c++ - 生成要在 Qt 中打印的表单

c++ - 用于单例销毁的 atexit : failure case

singleton - WebLogic集群单例服务

c# - 未知语言随机码生成器

c++ - 如何在 C++ 中使用 libmosquitto 和 SSL/TLS 连接到 mqtt 代理

c++ - 排序 ListView (Win32/C++)

c++ - OpenCV 找不到图像

c++ - 提供相对文件路径

c# - 如何在 C# 中创建一个只能有一个实例的类