2016-12-06 6 views
1

条件付きでカスタムQML要素のプロパティを設定しようとしています。意味私は何かが真実ならそれを設定したいだけです。QMLでプロパティを条件付きでのみ設定する

この例では、アプリケーションに特定の値がある場合はsomePropertyに設定しますが、そうでない場合はオブジェクトに元の値を保持させたいとします。また、私はそれがバインディングのように動作するようにしたい。つまり、条件が変更された場合は、プロパティを再度リストア/設定します。

main.qml

ApplicationWindow { 
    visible: true 
    width: 640 
    height: 480 
    title: qsTr("Hello World") 

    MyObject { 
     someProperty: (title == "different" ? "other_value" : 'undefined') 
    } 
} 

MyObject.qml

Rectangle { 

    property var someProperty: "original_value" 

    Component.onCompleted: { 
     console.error("MyOject.someProperty: " + someProperty) 
    } 
} 

ので、この版画:

QML:MyOject.someProperty:未定義

は、私はそれが

QMLを印刷したい:MyOject.someProperty:

  • someProperty: (title == "different" ? "other_value"):だから私は試してみました

original_valueエラーを

  • someProperty: (title == "different" ? "other_value" : someProperty):結合ループ
  • onCompletedという種類の構文は使用したくないのですが、バインディングを保持し、自分のコードを捨てないためです。

    答えて

    1

    あなたはPropertyChangesと一緒Statesを使用し、条件が満たされたときに、アクティブにする状態を設定できますBinding要素

    MyObject { 
        id: myObject 
    } 
    
    Binding { 
        target: myObject 
        property: "someProperty" 
        value: "other_value" 
        when: title == "different" 
    } 
    
    +1

    動作しません。条件が間違って再び変わると、元の値は復元されません。 – derM

    +0

    確かにこのバグレポートが見つかりました:https://bugreports.qt.io/browse/QTBUG-33444 – RvdK

    +0

    @derM:以前の値がバインディングではなく、バインディング時に復元されたときのみ:property string someProperty: (true? "original_value": "original_value") – RvdK

    2

    と試みることができます。

    State -Systemには、Stateを再度残すと元の状態に復元されるという特性があります。

    +0

    ありがとう、私はそれを見上げたが、私はそれが適しているとは思わない。条件付きで設定される5つ以上のプロパティを持つコンポーネントがあります。これは、1だけがアクティブである状態を使用することはできません。 – RvdK

    +0

    @RvdK:一緒に変化するプロパティのサブセットごとに複数の* StateMachines *を定義できます。どちらか一方だけを目的とする 'Item'を定義することも、親ノードのいくつかのプロパティを変更する状態を持たせることも、' StateGroup'を使うこともできます。 http://doc.qt.io/qt-5/qml-qtquick-stategroup.html – derM

    関連する問題