Size: a a a

2020 May 04

m

mefest in Qt
Kathy Ti
мне там просто приходилось перелопатить всю программу под использование с++ модели
это странно, обычно модель не зависит сильно от логики всей программы
источник

AS

Anatoly Shirokov in Qt
Kathy Ti
там вместо имён были какие-то жуткие индексы
индекс - это унифицированный способ адресации элементов модели
источник

KT

Kathy Ti in Qt
местами можно было имена использовать которые были переопределены ролям, но местами индексы
источник

KT

Kathy Ti in Qt
mefest
это странно, обычно модель не зависит сильно от логики всей программы
у меня логика от модели зависит
источник

AS

Anatoly Shirokov in Qt
Kathy Ti
местами можно было имена использовать которые были переопределены ролям, но местами индексы
нет, так не пойдет, попробуй отделить мух от котлет
источник

AS

Anatoly Shirokov in Qt
не мешай все, а выдели, что не понятно
источник

KT

Kathy Ti in Qt
на 3000+ строк кода 100+ обращений к данным модели(моделей - у меня там много листов и моделей)
источник

m

mefest in Qt
Kathy Ti
местами можно было имена использовать которые были переопределены ролям, но местами индексы
вроде нет. каждый индекс может возвращать разные данные в зависимости от роли
источник

AS

Anatoly Shirokov in Qt
mefest
вроде нет. каждый индекс может возвращать разные данные в зависимости от роли
в QML нет, только данные, там в качестве роли выступает имя столбца
источник

KT

Kathy Ti in Qt
Anatoly Shirokov
не мешай все, а выдели, что не понятно
там реально где я обращалась к полю в qml как к "role" были индексы из с++
а там где model.get(index).role там можно было по имени как было определено в с++ в roles
ну или наоборот
источник

AS

Anatoly Shirokov in Qt
Kathy Ti
там реально где я обращалась к полю в qml как к "role" были индексы из с++
а там где model.get(index).role там можно было по имени как было определено в с++ в roles
ну или наоборот
смотри
источник

AS

Anatoly Shirokov in Qt
чтобы иметь возможность обращаться из QML к данным С++ модели есть метод roleNames
источник

AS

Anatoly Shirokov in Qt
например,
QHash<int, QByteArray> EntityModel::roleNames() const
{
   static const QHash<int, QByteArray> roles = {
       {EntityRole, "entity"},
       {DeletedRole, "deleted"},
       {BufferedRole, "buffered"},
       {VisibleRole, "visible"},
   };

   return roles;
}
источник

AS

Anatoly Shirokov in Qt
я объявляю соответствие, чтобы в QML обращаться к entity, deleted, buffered, visible
источник

AS

Anatoly Shirokov in Qt
данные я отдаю в методе data
QVariant GenericEntityModel::data(const QModelIndex &index, int role) const
{
   if (index.isValid()) {
       switch (role) {
       case EntityRole:
           return m_list[index.row()].entity;
       case VisibleRole:
           return m_list[index.row()].visible;
       case BufferedRole:
           return m_list[index.row()].buffered;
       case DeletedRole:
           return m_list[index.row()].deleted;
       }
   }
   return QVariant();
}
источник

AS

Anatoly Shirokov in Qt
все, вот и вся связь
источник

AS

Anatoly Shirokov in Qt
роли должны стартовать с Qt::UserRole
источник

AS

Anatoly Shirokov in Qt
enum { EntityRole = Qt::UserRole, BufferedRole, DeletedRole, VisibleRole };
источник

AS

Anatoly Shirokov in Qt
чтобы не было перекрытия с системными ролями
источник

AS

Anatoly Shirokov in Qt
итого, в C++ ты используешь enum { EntityRole = Qt::UserRole, BufferedRole, DeletedRole, VisibleRole }; для доступа к полям записи
источник