如何在 Qml 中将附加的 属性 传播到 children?
How propagate an attached property to children in Qml?
我想制作类似 Material.accent 的东西,我可以在其中更改 parent 和 children 以获得 parent 属性 定义。
这是我此时的做法,但我在文档中找不到任何相关信息。
我知道这是可能的,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 的代码呢?我给你介绍 Woboq.org.
Here 你可以看到 Material 主题实际上 pro-actively 将主题推送到 children:
void QQuickMaterialStyle::propagateTheme()
{
const auto styles = attachedChildren();
for (QQuickAttachedObject *child : styles) {
QQuickMaterialStyle *material = qobject_cast<QQuickMaterialStyle *>(child);
if (material)
material->inheritTheme(m_theme);
}
}
我想制作类似 Material.accent 的东西,我可以在其中更改 parent 和 children 以获得 parent 属性 定义。
这是我此时的做法,但我在文档中找不到任何相关信息。 我知道这是可能的,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 的代码呢?我给你介绍 Woboq.org.
Here 你可以看到 Material 主题实际上 pro-actively 将主题推送到 children:
void QQuickMaterialStyle::propagateTheme()
{
const auto styles = attachedChildren();
for (QQuickAttachedObject *child : styles) {
QQuickMaterialStyle *material = qobject_cast<QQuickMaterialStyle *>(child);
if (material)
material->inheritTheme(m_theme);
}
}