2014-09-04 3 views
1

У меня есть map = std::map<std::string, myItemModel *>, где myItemModel наследует QAbstractItemModel.Комбинация QAbstractItemModels

Я хочу сейчас комбинировать все myItemModel в одном myItemModel (всякая другая модель товара тоже будет прекрасна). Так что есть один большой myItemModel.

Возможно ли сделать это? Qt-way?

+1

Что означает «объединить все myItemModel в одном myItemModel»? Просьба уточнить. – vahancho

+0

Я хочу одну модель boig, которая включает в себя все другие модели. – user2699453

+1

Не думаю, что это возможно. Модель элемента - это не простой набор элементов, но определяет функциональность. Как вы собираетесь сочетать функциональность? – vahancho

ответ

2

Это можно сделать, но это не тривиально. Это зависит от вашей реализации QAbstractItemModel, и поэтому это не было сделано в Qt.

Вот шаги по реализации модели, которая представляет собой набор моделей:

  1. Создайте новый класс, унаследованный от QAbstractItemModel
  2. Добавить методы для добавления других моделей в эту
  3. процесс всех сигналов от ребенка модели, которые содержат индексы (вам нужно их изменить, посмотрите # 10)
  4. Вперед все сигналы, которые не содержат индексов.
  5. Внесите rowCount и укажите сумму всех строк моделей.
  6. Внесите columnCount и укажите количество столбцов в ваших моделях.
  7. Внедрение index, return createIndex (строка, столбец, NULL);
  8. Внесите parent, return QModelIndex(); Я надеюсь, что ваши модели не являются деревьями
  9. Внесите data, setData и т.д., обращаясь к нужной модели. Используйте методы из # 10 для преобразования индексов.
  10. Создайте методы для преобразования индекса детской модели в индекс базовой модели и обратно.
 
    Example (indexes): 
    BaseModel ChildModel1 ChildModel2 
     0,0  0,0   
     1,0  1,0   
     2,0     0,0 
     3,0     1,0 
     4,0     2,0 

P.S. Подумайте о создании кеша отображения индексов.

Это пример метода для преобразования индекса модели в базового индексу ребенок модели:

const QModelIndex childModelIndex(const QModelIndex& baseModelIndex) const 
{ 
    if (!baseModelIndex.isValid()) 
    { 
    return QModelIndex(); 
    } 

    int count = 0; 
    const int row = baseModelIndex.row(); 

    for (QList<QAbstractTableModel*>::const_iterator it = m_models.begin(); 
    it != m_models.end(); it++) 
    { 
    const int currentCount = (*it)->rowCount();  

    if (row >= count && row < count + currentCount) 
    {  
     return (*it)->index(row - count, 0); 
    } 

    count += currentCount; 
} 

ASSERT(false); 

return QModelIndex(); 

}

Это является примером способа для преобразования модели ребенка индекс к индексу модели базовой:

QModelIndex baseModelIndex(const QModelIndex& childModelIndex) const 
{ 
    int row = childModelIndex.row(); 

    for (QList<QAbstractTableModel*>::const_iterator it = m_models.begin(); 
     it != m_models.end(); it++) 
    { 
     if (childModelIndex.model() == *it) 
     { 
      return index(row, ind.column()); 
     } 

     row += (*it)->rowCount(); 
    } 

    return QModelIndex(); 
} 
+0

Как будет предлагаемый подход разрешать конфликты между моделями. Например, model1 возвращает «Foo», а model2 возвращает «Goo» из функции 'data()'? – vahancho

+0

@vahancho Никаких конфликтов. Метод 'data' имеет индекс в качестве аргумента.Предположим, что представление задано для данных inx (3,0): 'base-> data (idx)'. См. Пример выше. Метод 'data' в базовой модели находит подходящую модель. Это model2, вычисляет индекс в этой модели idx2 (1,0) и возвращает 'model2-> data (idx2)' – Ezee

Смежные вопросы