2

有一个关于如何从单例对象属性绑定到 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;
}

但这实际上不是一个属性绑定,因为它是一个赋值。

那么对于单例对象属性是否有更自然的绑定方式?

4

2 回答 2

3

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

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

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

于 2016-03-02T19:34:28.520 回答
0

这本质上就是属性绑定所做的事情,至少我认为它就是这样做的——它将相关变量的 changed() 信号连接到重新评估引用它们的绑定表达式。

所以这在实践中是一个绑定:

onQmlNameChanged: {
    Singleton.name = qmlName;
}

如果您只执行一次分配,您只会遇到问题,但如果它附加到信号,它将按预期从绑定中不断更新。

这将与 a 相同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 正在为您执行此操作。

于 2016-03-02T15:44:14.663 回答