Estoy trabajando en un QML proyecto. En la interfaz de usuario en el que estoy trabajando, necesito actualizar regulador de C++, y leer el valor actual en C++ de QML. Propiedades parece ser la solución adecuada. Hasta ahora he leído diferentes preguntas sin éxito Dos vías de enlace C++ modelo en QML, Cambió las Propiedades no de la señal de disparo, etc... En mi actual código que he declarado bien en mi clase de C++
class MyClass : public QObject {
Q_OBJECT
public:
MyClass(QObject*);
Q_PROPERTY(double myValue READ getMyValue WRITE setMyValue NOTIFY myValueChanged)
void setMyValue(double n) {
std::cerr << "myValue being update: " << n << "\n";
myValue = n;
}
double myValue = 30;
...
}
Y expuesto en Qt a través de un singleton
qmlRegisterSingletonInstance("com.me.test", 1, 0, "MyClass", &myClass);
Entonces obligado el C++ propiedad a un QML control deslizante
import com.me.test
ApplicationWindow {
Slider {
id: slider
height: 30
width: 100
from: 0
to: 100
value: myClass.myValue
onValueChanged {
console.log("value = " + value)
console.log("myClass.myValue = " + myClass.myValue)
}
/* Doesn't help
Binding {
target: slider
property: "value"
value: myClass.myValue
}*/
}
}
El enlace parece que funciona. Puedo modificar el valor de myValue
entonces emiten myValueChanged
para hacer QML actualización del control deslizante. Pero dado que myClass.myValue
está limitada a slider.value
. Me asumir ambos valores se actualizan al mismo tiempo. Pero arrastrando el control deslizante de la muestra que tienen valores diferentes. La siguiente es lo que se imprime en la consola cuando arrastro mi slider.
qml: value = 19.863013698630137
qml: myClass.myValue = 30
Además setMyValue
parece no ser llamados a menos explícito de asignación se hace como myClass.myValue = 0
. También probé el componente de la Unión, sin éxito. ¿Por qué es este el caso y podría hacer que el C++ de la propiedad actualizado cada vez que me arrastre el control deslizante?
Qt: 6.2.1
Compilador: clang/gcc
OS: Windows/Linux
Actualización: probado un inversa de unión. Todavía la impresión de que el mismo resultado
import com.me.test
ApplicationWindow {
Slider {
id: slider
height: 30
width: 100
from: 0
to: 100
value: myClass.myValue
onValueChanged {
console.log("value = " + value)
console.log("myClass.myValue = " + myClass.myValue)
}
Binding {
target: myClass
property: "myValue"
value: slider.value
}
}
}
myClass.myValue
se actualizará y se desencadena sumyValueChanged
?