한국어
Qt
 

엑세스할 수 없는 속성에 바인딩

C++에서 QML로 노출하거나 내보낸 객체의 속성과 같이 QML에서 직접 인스턴스화하지 않은 다른 개체의 속성에 바인딩해야 하는 경우가 있다. Binding 타입을 사용하여 객체들의 속성간 동적 바인딩을 생성할 수 있다. 예를 들어 myobject1.x 속성을 Binding을 사용하여 업데이트할 수 있다. 즉, 텍스트가 변경되면 C++ 속성 x가 자동으로 업데이트된다.

C++

...
class MyObject : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString x READ x WRITE setX)
...
}

...
MyObject myobject1;
engine.rootContext()->setContextProperty("myobject1", &myobject1);
...

 

QML

...
    TextEdit { 
        id: myTextField 
        text: "Please type here..." 
    }

    Binding { 
        target: myobject1
        property: "x" 
        value: myTextField.text 
    }
...

 

 

조건부 바인딩

특정 조건이 충족됐을 때만 속성 값을 수정하도록 설정할 수 있다.

관련 있는 모든 분기에 대해 값을 제공해야 하므로 직접 바인딩으로는 이 작업을 수행할 수 없는 경우가 많다.

예를 들어 아래 예제 코드는 마우스를 놓을 때마다 경고를 표시한다. 마우스를 누르지 않았을 때 바인딩 값이 정의되지 않았기 때문이다.

...
    // produces warning: "Unable to assign [undefined] to double value"
    property int value: if (mouse.pressed) mouse.mouseX

    Rectangle {
...
        MouseArea {
            id: mouse
            anchors.fill: parent
        }
    }
...

 

다음과 같은 코드를 사용하면 당장 경고를 회피할 수 는 있다. 이것은 바인딩이 끊어진 채로 유지되므로 바람직하지 않다.

...
    property int value
...
        MouseArea {
            id: mouse
            anchors.fill: parent
            onPressed: {
                value = mouseX
            }
        }
...

 

Binding 을 사용하는 것이 바람직하다. restoreMode 속성은 바인딩이 비활성화 되었을 때 원래 값을 복원해야 하는지 여부와 복원 방법을 설명하는 데 사용할 수 있다. 기본 값(default value)은 Binding.RestoreBinding 로 설정된다.

...
    property int value

    Rectangle {
...
        MouseArea {
            id: mouse
            anchors.fill: parent
        }
    }

    Binding on value {
        when: mouse.pressed
        value: mouse.mouseX
        restoreMode: Binding.RestoreNone
    }
...

 

https://doc.qt.io/qt-5/qml-qtqml-binding.html