【问题标题】:How propagate an attached property to children in Qml?如何在 Qml 中将附加属性传播给子级?
【发布时间】:2020-08-22 06:26:36
【问题描述】:

我想制作类似 Material.accent 的东西,我可以在其中更改父级和子级以获取父级属性定义。

这是我此时所做的方式,但我在文档中找不到任何有关它的信息。 我知道这是可能的,Material Style 也使用这种方法和其他的东西,比如字体属性。

class MyThemeAttached : public QObject {
    Q_OBJECT

    Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
    QML_ANONYMOUS

public:
    explicit MyThemeAttached(QObject* parent = nullptr)
        : QObject(parent)
    , m_color("#FF0000"){}

    QColor color() const;
    void setColor(const QColor color);

signals:
    void backgroundChanged(QColor background);

private:
    QColor m_color;
};


class MyTheme : public QObject
{
    Q_OBJECT
    QML_ATTACHED(MyThemeAttached)
    QML_ELEMENT
public:
    explicit MyTheme(QObject *parent = nullptr);

    static MyThemeAttached *qmlAttachedProperties(QObject *object) {
        return new MyThemeAttached(object);
    }
};


ApplicationWindow {
    id: root
    visible: true
    width: 800
    height: 600
    title: qsTr("Window")
    
    MyCustomProperty.color: "orange"

    Rectangle {
        color: MyCustomProperty.color        
    }
}

【问题讨论】:

  • 我会使用一些全局变量,一个单例。我猜Material也一样。请参阅here 了解更多信息。

标签: c++ qt qml qqmlcomponent qqmllistproperty


【解决方案1】:

为什么不看看 Material 的代码呢?我向您介绍 Woboq.org。

Here你可以看到Material主题其实是主动向孩子们推送主题:

void QQuickMaterialStyle::propagateTheme()
{
    const auto styles = attachedChildren();
    for (QQuickAttachedObject *child : styles) {
        QQuickMaterialStyle *material = qobject_cast<QQuickMaterialStyle *>(child);
        if (material)
            material->inheritTheme(m_theme);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 2012-10-27
    • 2021-06-28
    相关资源
    最近更新 更多