QML ListView с использованием QList в качестве модели

документация Qt кажется немного короткой по этой проблеме, но я пытаюсь использовать QLists в качестве моделей для ListView. Дело в том, что я представляю иерархию, и всякий раз, когда элемент нажат, модель заменяется другой, которую QML получает от обратного вызова c++.

- Это объект, представляющий элемент списка:

class MyObject : public QObject
{
  Q_OBJECT
  Q_PROPERTY(QString         name     READ getName WRITE setName)
  Q_PROPERTY(QString         subtitle READ getSubtitle)
  Q_PROPERTY(QList<QObject*> descent  READ getChildren NOTIFY childrenUpdated)
  ...
}

и как я использую его в QML:

ListView {
  id: list_view
  model: myModel
  anchors.fill: parent
  delegate: Item {
    id: row
    height: 50
    anchors.left: parent.left
    anchors.right: parent.right

    MouseArea {
      anchors.fill: row
      onClicked: {
        list_view.model = descent;
      }
    }

    Column {
      Text { text: name }
      Text { text: subtitle }
    }
  }
}

модель "myModel" установлена в основном, как это:

context->setContextProperty("myModel", QVariant::fromValue(folder.getChildren()));

первый появляется time ListView, он использует myModel в качестве модели и работает. Однако всякий раз, когда я нажимаю на элемент, ListView создает точное количество ожидаемых элементов... но он не может прочитать ни одно из их свойств !

как ListView точно знает, сколько элементов ему нужно создать, но не может видеть их свойства ?

1 ответов


Я считаю, что это правильное поведение вы наблюдаете. QML знает количество элементов в QList но что касается запроса их для name и subtitle это невозможно, потому что descent не соответствует ограничениям ListView::model

из документации QML для ListView:: свойство модели:

модель предоставляет набор данных, который используется для создания элементов в вид. Можно создавать модели непосредственно в QML, используя ListModel, XmlListModel или VisualItemModel, или предоставляемые классами моделей c++. Если используется класс модели C++, он должен быть подклассом QAbstractItemModel или простой список.

поэтому в этом отношении вам придется либо изменить descent быть простым списком, который я считаю, означает, что содержит простые данные, такие как один QString, int, etc... или реализовать его как QAbstractItemModel, который содержит список QObjects.