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
.