엑세스할 수 없는 속성에 바인딩
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