有关于如何从单例对象属性绑定到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,因为它是一项任务。
那么对单例对象属性有更多的自然绑定方式吗?
答案 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正在为您做这件事。