【问题标题】:QML: default binding for derived propertyQML:派生属性的默认绑定
【发布时间】:2019-08-31 15:13:54
【问题描述】:

我想用 C++ 重新实现以下 QML 组件 (MyComp.qml):

QtObject {
    property bool a: true
    property bool b: false
    // default: binding to a && b
    property bool derived: a && b
}

看起来像这样:

class MyComp : public QObject
{
Q_OBJECT
public:
    explicit MyComp(QObject *parent = nullptr);
    Q_PROPERTY(bool a MEMBER a_ NOTIFY aChanged)
    Q_PROPERTY(bool b MEMBER b_ NOTIFY bChanged)
    Q_PROPERTY(bool derived MEMBER derived_ NOTIFY derivedChanged)
signals:
    void aChanged();
    void bChanged();
    void derivedChanged();
private:
    bool a_ {true};
    bool b_ {false};
    // I want to set up a default binding derived = a && b that is
    // overridable, just like in the QML component; probably in
    // the impl. of the default ctor
    bool derived_ {true};
}

这有效,除了derived 的评论中描述的内容。 IE。在 QML 中,以下实例应该都可以工作:

MyComp {
    id: default_behavior
    // should use default a && b binding for derived
}

MyComp {
    id: fixed_value
    derived: false
}

MyComp {
    id: bind_to_other
    derived: a && b && some.other.value
}

【问题讨论】:

  • 你有什么问题?
  • 当你说,“C++ 的翻译是直截了当的”.. 怎么样.. ?你尝试了什么?
  • 试图澄清一下。我想以编程方式为 MyComp 设置默认绑定,就像我在 QML 组件中使用 "property bool derived: a && b"""
  • 你是说 default_behavior 不像你想要的那样工作,但是 fixed_value 和 bind_to_other 却能像你想要的那样工作?
  • default_behavior 无法工作,因为我不知道如何以编程方式在 C++ 中创建从派生到“a && b”的绑定,就像我在 QML 中使用“property bool derived: a && b”行一样(作为默认的预配置绑定)。

标签: qt binding qml


【解决方案1】:

由于我没有任何可用的 Qt 环境,这将只是一个想法的粗略草图,以解决问题。

  1. 不要使用 MEMBER-Properties,而是使用 SETTER 和 GETTER 的那些
  2. 写一个槽:
    void onAorBChanged() { setDerived(getA() && getB()); }

  3. 将该插槽连接到构造函数中的信号aChanged() 和bChanged()。
    connect(this, &MyComp::aChanged, this, &MyComp::onAorBChanged);
    connect(this, &MyComp::bChanged, this, &MyComp::onAorBChanged);

  4. 一旦调用了derived 的SETTER,就断开该插槽与两个(所有)信号的连接。
    disconnect(this, 0, this, &MyComp::onAorBChanged)

当然,您需要为derived 设置两个setter - 您在2 中调用的那个。 不应该断开插槽。只有你用于Q_PROPERTY的那个


可能更安全的解决方案是在 QML 中进行。 所以你用 C++ 定义你的CppMyComp,然后你创建一个 QML 组件MyComp

// MyComp.qml
CppMyComp {
    derived: a && b
}

您稍后会使用它:

MyComp {
    id: defaul_behaviour
    // derived is bound, but the binding can be easily overridden.
}
MyComp {
    id: fixed_value
     derived: false
}
MyComp {
    id: bind_to_other
    derived: a && b || someOther
}

【讨论】:

  • 谢谢!这就是我害怕的蛮力解决方案。希望有一种以编程方式创建 QQmlBindings 的方法。一旦 SO 允许,将奖励赏金......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 2012-02-23
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多