繁体   English   中英

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

[英]How to bind a property to a singleton object property from QML

还有一个问题,如何从一个单独的对象属性绑定到一个QML属性。 但是,如果我们想将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;
}

但这实际上不是属性绑定 ,因为它是分配。

那么,还有更多的单例对象属性绑定方法吗?

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

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

不过,它适用于普通的QML对象,但不能确定它是否适用于Singleton类。 无论如何,您可以在“从JavaScript创建属性绑定”部分中了解有关此方法的更多信息。

从本质上讲,这就是属性绑定的作用,至少我认为是它所做的-将相关变量的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会为您执行此操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM