#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
}
# ...