[英]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.