Bir QML projesi üzerinde çalışıyorum. Üzerinde çalıştığım kullanıcı arayüzünde, hem kaydırıcıyı C++ 'dan güncellemem hem de geçerli değeri qml'den C++' ya okumam gerekiyor. Özellikler doğru çözüm gibi görünüyor. Şimdiye kadar, qml'de başarılı bir şekilde iki yönlü bağlama C++ modeli olmadan farklı sorular okudum, Değiştirilen Özellikler sinyali tetiklemiyor, vb... Geçerli kodumda C++ sınıfımda bir özellik bildirdim
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;
...
}
Ve bir singleton aracılığıyla Qt'ye maruz bıraktı
qmlRegisterSingletonInstance("com.me.test", 1, 0, "MyClass", &myClass);
Sonra C ++ özelliğini bir QML kaydırıcısına bağladı
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
}*/
}
}
Bağlama işe yarıyor gibi görünüyor. Değerini değiştirebilirim myValue
sonra yay myValueChanged
qml'yi güncellemek için kaydırıcıdır. Ama bu göz önüne alındığında myClass.myValue
ile sınırlıdır slider.value
. Her iki değerin de aynı anda güncellendiğini varsayardım. Ancak kaydırıcıyı sürüklemek, farklı değerlere sahip olduklarını gösterir. Kaydırıcımı sürüklediğimde konsolda yazdırılan şey aşağıdadır.
qml: value = 19.863013698630137
qml: myClass.myValue = 30
Bundan başka setMyValue
açık bir atama yapılmadığı sürece çağrılmıyor gibi görünüyor myClass.myValue = 0
. Bağlama bileşenini de başarılı olamadan denedim. Bu neden böyle ve kaydırıcıyı sürüklediğimde C++ özelliğini güncelleyebilir miyim?
Qt: 6.2.1
Derleyici: clang / gcc
İşletim SİSTEMİ: Windows / Linux
Güncelleme: ters bağlamayı test etti. Hala aynı sonucu yazdırıyor
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
güncellenecek ve ateşlenecekmyValueChanged
?