Почему делегат ListView не может ссылаться на свойства ListView?

#qt #listview #properties #qml

#qt #listview #свойства #qml

Вопрос:

Если ListView содержит пользовательские свойства, на эти свойства можно ссылаться в привязке для model , но они не могут ссылаться ни на что внутри делегата. Почему это?

В документах, кажется, говорится, что компонент должен иметь возможность видеть свойства во внутренних областях, где он был объявлен.

 import QtQuick 2.12
import QtQuick.Controls 2.12

ApplicationWindow {
    visible:true

    ListView {
        orientation: ListView.Vertical; height: 300; width: 100

        property var myCount: 3
        property var myMessage: "Hello"

        Component {
          id: myComp
          Text {text: myMessage} // ReferenceError: myMessage is not defined
        }
        model: myCount // this works
        delegate: myComp
    }       
}

  

(В моем реальном приложении ListView является компонентом (.qml-файл), и вызывающему устройству необходимо передать информацию, необходимую для настройки делегата; не
буквенный текст, как в этом примере, но информация для вложенного ListView.)

Спасибо за любую помощь…

Ответ №1:

Переменные в QML имеют область видимости, в вашем случае при использовании MyMessage без ссылки это указывает на то, что переменная принадлежит текстовому элементу.

 # ...
Component {
    id: myComp
    Text {text: myMessage} 
}
# ...
  

Итак, решение состоит в том, чтобы использовать идентификатор ListView в качестве ссылки:

 # ...
ListView {
    id: lv
    orientation: ListView.Vertical; height: 300; width: 100
    property var myCount: 3
    property var myMessage: "Hello"
    Component {
      id: myComp
      Text {text: lv.myMessage} 
    }
    model: myCount // this works
    delegate: myComp
}
# ...