用C++改变QML单体的性质

用C++改变QML单体的性质,c++,qt,singleton,qml,qtquick2,C++,Qt,Singleton,Qml,Qtquick2,我正在实现一个简化的Ubuntu触摸面板,而不是每个元素一个 有一个全局AletteSetting singleton: pragma Singleton import QtQuick 2.5 QtObject { property Palette current: NonePalette {} } 还有一些调色板类,如NonePalette或Dark: 因此,可以在QML中更改全局调色板: import "Customization/Palettes/Dark" //...

我正在实现一个简化的Ubuntu触摸面板,而不是每个元素一个

有一个全局AletteSetting singleton:

pragma Singleton

import QtQuick 2.5

QtObject {
    property Palette current: NonePalette {}
}
还有一些调色板类,如NonePalette或Dark:

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

import "Customization/Palettes/Dark"

//...

DarkPalette {
    id: dark
}

Component.onCompleted: {
    GlobalPaletteSetting.current = dark
}
我想通过设置环境变量来设置全局调色板。就像QtQuick样式正在工作一样

<> P>因此,C++需要一个对全局PaltEtTebug的访问。以及使用选项板加载QML文件并将globalPaletSetting.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是我的样式定义,一个单例。您可以在以下位置找到完整的示例:

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


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

您在哪里实例了GlobalPalettetteSetting对象?事实上,我猜它不是单例,因为您可以创建一个对象的多个实例。无论如何,您可以在QML中为您的单例定义objectName,并从C++访问它:rootObject.FindChildSomeObjectNameGlobalAletteSetting是一个单例pragma单例。在文章中添加了标题。是的,objectName的技巧将不起作用,因为没有父项的singleton为null。尚未将其添加到我的项目中,但这是解决方案。基本上,在C++中创建指向单体的QtoTobe。关于样式的无关说明:我正在使用自定义QtQuick样式,可以通过标准QT_QUICK_控件_STYLE env var进行选择。现在我可以添加另一个env var来选择将使用的调色板样式。嘿,你的答案似乎是我想要的,但我无法让它工作。我在我的项目中设置了一个与您相同的单例,我在整个QML文件中使用它。我希望在某些情况下能够以编程方式更改此单例的一个属性。我不确定确切地把代码放在你的样本中。我想你想修改C++中的单属性吗?然后,需要将上述代码示例中的“样式”存储在类成员中,并在需要时使用示例的最后两行修改属性。你遇到什么问题了吗?
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));