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.textSingleton オブジェクトのプロパティにバインドしたいと思い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;
}

割り当てを 1 回だけ実行する場合にのみ問題が発生しますが、信号に関連付けられている場合は、バインディングから期待どおりに更新され続けます。

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 に答える