如何将属性绑定到QML的单例对象属性

时间:2016-03-02 12:47:25

标签: qt qml qtquick2 property-binding

有关于如何从单例对象属性绑定到QML属性的question。但是,如果我们想将QML属性绑定到单个对象,那该怎么办呢。

这是单例类定义

class Singleton : public QObject {
    Q_OBJECT
    Q_PROPERTY(QString name READ name WRITE setName)
public:
    explicit Singleton(QObject *parent = nullptr);
    QString name() const;
    void setName(const QString &name);
private:
    QString m_name;
};

关于QML

property string qmlName: textField.text
TextField {
    id: textField
}

我想将textField.text绑定到Singleton对象name属性。可以使用类似的解决方法绑定它,

onQmlNameChanged: {
    Singleton.name = qmlName;
}

但实际上它并不是Property Binding,因为它是一项任务。

那么对单例对象属性有更多的自然绑定方式吗?

2 个答案:

答案 0 :(得分:1)

您可以尝试分配这样的绑定:

Component.onCompleted: Singleton.name = Qt.binding(function() { return qmlName })

它适用于普通的QML对象,但不确定它是否适用于单例类。无论如何,您可以在"Creating Property Bindings from JavaScript"部分了解有关此方法的更多信息。

答案 1 :(得分:0)

这实际上是属性绑定的作用,至少我认为它是它的作用 - 它连接相关变量的changed()信号以重新评估引用它们的绑定表达式。

所以这在实践中是一种约束力:

onQmlNameChanged: {
    Singleton.name = qmlName;
}

如果您只执行一次分配,则只会遇到问题,但如果它附加到信号上,它将继续按预期更新绑定。

这与Singleton.name : qmlName相同,遗憾的是,QML语法不允许以这种形式执行此操作。所以对于所有意图和目的,你确实有一个绑定,即使它使用不同的语法来实现它。

事实上,这不应该与QML在地毯下为你做的有很大的不同。例如绑定:

someProp : anotherProp + yetAnotherProp

实现如下:

function unnamed(this) { return this.anotherProp + this.yetAnotherProp }
anotherPropChanged.connect(function(this) { this.someProp = unnamed(this) })
yetAnotherPropChanged.connect(function(this) { this.someProp = unnamed(this) })

显然,手动操作非常麻烦,特别是当表达式变得更复杂并引用更多对象时,QML正在为您做这件事。