Sto lavorando su un QML progetto. Nell'interfaccia utente a cui sto lavorando, ho bisogno sia di aggiornare il dispositivo di scorrimento da C++ e leggere il valore della corrente in C++ da QML. Proprietà sembra essere la soluzione giusta. Finora ho letto diverse domande su COSÌ senza successo Due modo vincolante C++ modello in QML, Cambiato Proprietà non segnale di trigger, ecc... Nel mio attuale codice che ho dichiarato un immobile nella mia 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;
...
}
E esposto in Qt tramite un singleton
qmlRegisterSingletonInstance("com.me.test", 1, 0, "MyClass", &myClass);
Quindi associata delle proprietà di C++ per un QML dispositivo di scorrimento
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
}*/
}
}
L'associazione sembra funzionare. Sono in grado di modificare il valore di myValue
quindi emettono myValueChanged
per rendere QML aggiornare il dispositivo di scorrimento. Ma dato che myClass.myValue
è delimitata a slider.value
. Mi piacerebbe assumere entrambi i valori vengono aggiornati allo stesso tempo. Ma trascinando il dispositivo di scorrimento indica che hanno valori diversi. Il seguente è ciò che viene stampato nella console quando ho trascinare il dispositivo di scorrimento.
qml: value = 19.863013698630137
qml: myClass.myValue = 30
Inoltre setMyValue
sembra non essere chiamati a meno che un'esplicita assegnazione è fatta come myClass.myValue = 0
. Ho provato anche il componente per l'Associazione, senza successo. Perché è questo il caso e potrei fare il C++ proprietà aggiornata ogni volta che ho trascinare il dispositivo di scorrimento?
Qt: 6.2.1
Compilatore: clang/gcc
OS: Windows/Linux
Aggiornamento: provato una associazione inversa. Ancora la stampa lo stesso risultato
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
sarà aggiornato e verrà generato l'myValueChanged
?