Pracuję nad projektem QML. W interfejsie użytkownika, nad którym pracuję, muszę jak zaktualizować suwak z C++, jak i odczytać aktualną wartość w C++ z QML. Właściwości wydają się być dobrym rozwiązaniem. Do tej pory czytałem różne pytania TAK, że bezskutecznie Model dwustronne wiązania C++ w QML, Zmienione właściwości nie powodują alarmu itp... W moim aktualnym kodzie ogłosiłem właściwość w klasie 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;
...
}
I wystawił go w Qt z pomocą syngielton
qmlRegisterSingletonInstance("com.me.test", 1, 0, "MyClass", &myClass);
Następnie przywiązał właściwości C++ do suwaka QML
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
}*/
}
}
Przyciąganie, wydaje się, działa. Mogę zmienić wartość myValue
następnie emitują myValueChanged
aby zaktualizować QML, to suwak. Ale biorąc pod uwagę to myClass.myValue
ograniczona slider.value
. Ja bym zasugerował, że obie wartości są aktualizowane jednocześnie. Ale przeciąganie suwaka pokazuje, że mają one różne znaczenia. Poniżej to, co jest drukowane w konsoli, gdy przeciągam swój suwak.
qml: value = 19.863013698630137
qml: myClass.myValue = 30
Ponadto setMyValue
wydaje się, że on nie jest wywoływana, jeśli nie jest spełniony wyraźny cel, np. myClass.myValue = 0
. Ja również bezskutecznie próbował składnik przyciągania. Dlaczego tak jest i czy mogę zaktualizować właściwość C++ za każdym razem, gdy pionowymi suwak?
Qt: 6.2.1
Kompilator: brzęk/gcc
SYSTEM operacyjny: Windows/Linux
Aktualizacja: przetestowano inaczej wiązanie. Wciąż piszę ten sam wynik
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
będzie aktualizowana i będzie działać jegomyValueChanged
?