#c #qml
#c #qml
Вопрос:
Я создаю подкласс QAbstractListModel
called MyModel
, это имена ролей:
QHashlt;int, QByteArraygt; MyModel::roleNames() const { QHashlt;int, QByteArraygt; names; names[FILE] = "file"; return names; }
Этот класс содержит вектор элементов, которые я заполняю в основном:
qmlRegisterTypelt;MyModelgt;("MyModels", 1, 0, "MyModel"); MyModel my_model; my_model.loadData(); QQmlApplicationEngine engine; engine.setImportPathList( QStringList() lt;lt; "qrc:///" ); engine.rootContext()-gt;setContextProperty(QStringLiteral("cpp_my_model"), amp;my_model); engine.load( QUrl( "qrc:/Resources/Qml/main.qml" ) )
В main.qml
, я добавил это GridView
, чтобы показать элементы моей модели:
GridView { id: my_view objectName: "my_view" cellWidth: my_view.width / 5 cellHeight: my_view.cellWidth anchors { left: parent.left; right: parent.right; top: title_bar.bottom bottom: parent.bottom; } model: cpp_my_model delegate: MyItem { file: model.file } }
В MyItem.qml
:
Item { id: my_item objectName: "my_item" required property string file Image { source: "file:///" file } }
Когда я это делаю, я получаю ошибку столько раз, сколько элементов в модели: Ошибка ссылки: модель не определена
Однако, когда я создаю компонент в main.qml
:
Component { id: my_component Item { id: my_item objectName: "my_item" Image { width: my_view.cellWidth height: my_view.cellHeight source: "file:///" model.file } } } delegate: my_component
Делая это, это работает, и я не понимаю, почему. Примечание: Я очень новичок в QML и, возможно, упускаю что-то глупое.
РЕДАКТИРОВАТЬ: Кажется, что если я оставлю экземпляр MyItem пустым, он будет работать:
delegate: MyItem {}
вместо:
delegate: MyItem { file: model.file }
QML, похоже, волшебным образом присваивает модель.файл в MyItem.файл. Тем не менее, если есть ссылка или кто-то, кто может объяснить, как все это работает, это избавит меня от многих запутанных дней впереди.
Комментарии:
1. Есть ли опечатка в вашем коде? У вас есть эта строка:
name: model.name
, но я не вижу свойства, вызываемогоname
в вашей модели.2. @JarMan, да, это опечатка, я отредактировал вопрос. Спасибо.
3.
MyItem
также, похоже, нет свойства, называемогоname
также. Должно ли это бытьfile: model.file
так ?4. Да, это упрощенная версия кода, и я забыл это изменить, извините!
5. Я собираюсь предположить, что ваша проблема может быть как-то связана с тем, что ваше имя свойства (
file
) идентично роли модели. Работает ли это, если вы используете другое имя?