Je suis en train de travailler sur un QML projet. Dans l'INTERFACE utilisateur sur lequel je travaille, j'ai besoin à la fois de mettre à jour curseur à partir de C++ et de lire la valeur actuelle en C++ à partir de QML. Propriétés semble être la bonne solution. Jusqu'à présent, j'ai lu différentes questions sur sans succès les Deux sens de la liaison C++ modèle dans QML, Modifié les Propriétés ne déclenchent pas de signal, etc... Dans mon code, je l'ai déclaré " bien dans ma classe 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;
...
}
Et exposée dans Qt par l'intermédiaire d'un singleton
qmlRegisterSingletonInstance("com.me.test", 1, 0, "MyClass", &myClass);
Ensuite lié les propriétés de C++ à un QML curseur
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
}*/
}
}
La liaison semble fonctionner. Je peux modifier la valeur de myValue
puis émettent myValueChanged
pour faire QML mise à jour c'est curseur. Mais étant donné que myClass.myValue
est bornée à slider.value
. Je suppose que les deux valeurs est mise à jour en même temps. Mais en faisant glisser le curseur indique qu'ils ont des valeurs différentes. La suite de ce qui est imprimé sur la console, si je fais glisser mon curseur.
qml: value = 19.863013698630137
qml: myClass.myValue = 30
En outre setMyValue
il semble ne pas être appelé, à moins qu'une affectation explicite est faite comme myClass.myValue = 0
. J'ai aussi essayé le composant de Liaison sans succès. Pourquoi est-ce le cas et si je pouvais faire le C++ propriété mise à jour à chaque fois que je fais glisser le curseur?
Qt: 6.2.1
Compilateur clang/gcc
OS: Windows/Linux
Mise à jour: testé un revers de liaison. Toujours l'impression de le même résultat
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
sera mis à jour et déclenche sonmyValueChanged
?