Pracuji na QML projektu. V UI, na které pracuju, potřebuju, aby oba aktualizace jezdce z C++ a číst aktuální hodnotu do C++ z QML. Vlastnosti, se zdá být správné řešení. Zatím jsem četl různé otázky, na TAK bez úspěchu obousměrné vazby C++ model v QML, Změněné Vlastnosti nejsou trigger signál, atd... můj současný kód, který jsem vyhlásil majetek v mé C++ třídy
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;
...
}
A vystavil ji do Qt pomocí singleton
qmlRegisterSingletonInstance("com.me.test", 1, 0, "MyClass", &myClass);
Pak vázán na C++ majetku QML slider
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
}*/
}
}
Závazné zdá se do práce. Můžu změnit hodnotu myValue
pak vyzařují myValueChanged
aby QML aktualizace je posuvník. Ale vzhledem k tomu, že myClass.myValue
je ohraničené na slider.value
. Předpokládám, že obě hodnoty se aktualizuje na stejnou dobu. Ale přetažením posuvníku ukazuje, že mají různé hodnoty. Následující to, co je vytištěno v konzoli, když jsem přetáhnout posuvník.
qml: value = 19.863013698630137
qml: myClass.myValue = 30
Dále setMyValue
zdá se, že není volána, pokud explicitní přiřazení se provádí jako myClass.myValue = 0
. Také jsem se snažil Závazné component, ale bez úspěchu. Proč tomu tak je a mohl jsem se C++ majetku aktualizován vždy, když jsem přetáhněte posuvník?
Qt: 6.2.1
Kompilátor: clang/gcc
OS: Windows/Linux
Update: testoval zpětné vazby. Stále tisk stejný výsledek
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
bude aktualizován a bude střílet svémyValueChanged
?