QML/ C : Ошибка ссылки: модель не определена при передаче модели из C в QML

#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 ) идентично роли модели. Работает ли это, если вы используете другое имя?