Jest nieruchomość var1 zadeklarowany w pliku1.qml. Nieruchomość jest widoczna w innych plikach QML, ale nie jest możliwe wykrycie jego zdarzenia onChange.

File1.qml:

Item {
 id: obj1Id
 property int var1: 0
 ...
 Component.onCompleted: {
  var1=2
  var1Changed()             <<<<<<<<<<<< emit signal "changed"
 }
 onVar1Changed: {}          <<<<<<<<<<<< signal is detected
 ...
}

File2.qml:

Item {
 id: obj2Id
 property int local_var: 0
 ...
 Component.onCompleted: {
  local_var = obj1Id.var1       <<<<<<<<<<<<<<<<< It is OK
 }
 onVar1Changed: {}              <<<<<<<<<<<<<<<<< Error
 obj1Id.onVar1Changed: {}       <<<<<<<<<<<<<<<<< Error
 ...
}

Czy to możliwe, że podejście lub w pliku2.qml musi dodać property int local_var: obj1Id.var1, a następnie onLocal_varChanged: {}?

1
Peter Kostadinov 22 listopad 2020, 20:29

1 odpowiedź

Najlepsza odpowiedź

W twoim kodzie jest kilka chwil, które mogą spowodować nieporozumienie. Ma sens, aby najpierw wymyślić.

Napisałeś:

 Component.onCompleted: {
  var1=2
  var1Changed()             <<<<<<<<<<<< emit signal "changed"
 }

Ale nie musisz ręcznie emitować tego sygnału. QML zrobi to dla ciebie. Tak więc nic nie zmieni się bez tej linii.


Napisałeś

 property int local_var: 0
 ...
 Component.onCompleted: {
  local_var = obj1Id.var1       <<<<<<<<<<<<<<<<< It is OK
 }

Jest to całkowicie ważny kod, ale musisz zrozumieć, że jest to jednorazowe przypisanie, a nie wiązanie wartości obj1Id.var1 do local_var, np. Jeśli zmienisz obj1Id.var1 - Nie oczekuj odpowiednio local_var.

Aby dokonać prawdziwego wiązania wartości, którą możesz używać Binding komponent lub Qt.binding Do tworzenia powiązań właściwości z JavaScript lub jak proponowałeś - dodaj właściwość {x2}}.


W każdym przypadku musisz mieć ważne odniesienie do swojego {x0}} w swoim file2.qml.

Jeśli podejście wiązania nie pasują do Ciebie - możesz używać {{x0 }} Typ QML.

W twoim przypadku kod należy umieścić wewnątrz file2.qml:

Connections {
  target: obj1Id
  onVar1Changed: console.log("obj1Id.var1 changed")
}
1
tro 23 listopad 2020, 06:57