Я работаю над проектом QML. В пользовательском интерфейсе, над которым я работаю, мне нужно как обновить слайдер с C++, так и прочитать текущее значение в C++ из QML. Свойства, похоже, являются правильным решением. До сих пор я читал разные вопросы по ТАК что безуспешно Модель двусторонней привязки C++ в QML, Измененные свойства не вызывают сигнала и т. Д... В моем текущем коде я объявил свойство в своем классе 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;
...
}
И выставил его в Qt с помощью синглтона
qmlRegisterSingletonInstance("com.me.test", 1, 0, "MyClass", &myClass);
Затем привязал свойство C++ к ползунку 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
}*/
}
}
Привязка, кажется, работает. Я могу изменить значение myValue
затем испускают myValueChanged
чтобы обновить QML, это слайдер. Но, учитывая это myClass.myValue
ограничивается slider.value
. Я бы предположил, что оба значения обновляются одновременно. Но перетаскивание ползунка показывает, что они имеют разные значения. Ниже приведено то, что печатается в консоли, когда я перетаскиваю свой ползунок.
qml: value = 19.863013698630137
qml: myClass.myValue = 30
Кроме того setMyValue
кажется, что он не вызывается, если не выполнено явное назначение, например myClass.myValue = 0
. Я также безуспешно пробовал компонент привязки. Почему это так и могу ли я обновлять свойство C++ всякий раз, когда перетаскиваю ползунок?
Qt: 6.2.1
Компилятор: clang/gcc
ОС: Windows/Linux
Обновление: протестировано обратное связывание. Все еще печатаю тот же результат
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
будет обновляться и будет срабатывать егоmyValueChanged
?