Vinculación de la propiedad ''marcada'' de Checkbox con un objeto C++ Q_PROPERTY
qt data-binding (2)
Como señala Leemes, al hacer clic en la casilla de verificación, el usuario rompe el enlace que ha creado. Por lo tanto, no cree el enlace, sino que se conecta directamente a la señal de cambio para manejar el caso "get". Use "onClicked" para manejar el caso "set". Esta solución requiere que también se inicialice en Component.onCompleted (). Por ejemplo...
CheckBox {
id: myCheck
onClicked: user.status = checked
Component.onCompleted: checked = user.status
Connections {
target: user
onStatusChanged: myCheck.checked = user.status
}
}
Estoy aprendiendo QtQuick y estoy jugando con el enlace de datos entre las clases de C ++ y las propiedades de QML.
En mi Modelo de objeto C ++, tengo dos propiedades:
Q_PROPERTY(QString name READ getName WRITE setName NOTIFY nameChanged)
Q_PROPERTY(bool status READ getStatus WRITE setStatus NOTIFY statusChanged)
Y en mi archivo .qml:
TextEdit {
placeholderText: "Enter your name"
text: user.name
}
Checkbox {
checked: user.status
}
Cuando cambio el nombre de usuario con setName
de mi código C ++, se refleja automáticamente en la vista. Cuando marque / desmarque la casilla de verificación, o cuando llame a setStatus()
desde mi código C ++, no pasa nada. Parece que la propiedad checked
de casillas de verificación no tiene el mismo comportamiento que los componentes TextEdit
.
No quiero vincular mis propiedades de manera declarativa. ¿Qt Quick no admite el enlace de propiedades?
Gracias por tu ayuda.
Una forma de evitar esto es restablecer el enlace (que el usuario elimine haciendo clic en la casilla de verificación) en onClicked
, por algo como:
CheckBox {
checked: user.status
onClicked: {
user.status = checked;
checked = Qt.binding(function () { // restore the binding
return user.status;
});
}
}
Esto evita problemas si no tiene la posibilidad de acceder a su modelo en el momento en que se invoca Component.onCompleted
.