Я свободно следил за статьей Блог Кристофа Думеза получить пользовательский класс QAbstractListModel для представления данных интерфейсу QML (QtQuick2) (QtQuick2ApplicationViewer). Однако, поскольку я использую Qt 5.0.0 (и MSVC2012), некоторые части его статьи не применяются. Например, конструктор ListModel больше не должен вызывать setRoleNames()
, так как setRoleNames()
был амортизирован в Qt 5.
ListModel::ListModel(ListItem* prototype, QObject *parent) :
QAbstractListModel(parent), m_prototype(prototype)
{
setRoleNames(m_prototype->roleNames());
}
Насколько я понимаю, класс, который наследуется от QAbstractListModel, должен определять только roleNames()
, поскольку она была изменена на Qt 5 как чисто виртуальная функция, поэтому в его примере я просто закомментирую setRoleNames(m_prototype->roleNames());
в конструкторе и все должно работать. Правильно?
Но вместо этого все определенные роли не определены при доступе через QML. Я могу проверить имена в C ++ с этим:
QHash<int, QByteArray> mynames = model->find("Elephant")->roleNames();
qDebug() << "Model: " << mynames;
В этом случае имена ролей для объекта Elephant печатаются как положено.
Верны ли мои предположения, или мне нужно сделать что-то еще, чтобы получить объект QAbstractListModel для совместного использования свойств элемента списка с QML2? Это кажется глупым вопросом, но документы на Qt5 сейчас так не работают, что я не могу понять.
Спасибо!
Вам нужно переопределить QAbstractListModel::roleNames() const
метод и ваши роли автоматически регистрируются в QML.
Есть рабочий пример предоставления QML модели, основанной на QAbstractListModel, в examples / quick / modelviews / abstractitemmodel.
Вы также можете рассмотреть возможность использования QQmlListProperty.
Других решений пока нет …