Это можно сделать, но это не тривиально. Это зависит от вашей реализации QAbstractItemModel
, и поэтому это не было сделано в Qt.
Вот шаги по реализации модели, которая представляет собой набор моделей:
- Создайте новый класс, унаследованный от
QAbstractItemModel
- Добавить методы для добавления других моделей в эту
- процесс всех сигналов от ребенка модели, которые содержат индексы (вам нужно их изменить, посмотрите # 10)
- Вперед все сигналы, которые не содержат индексов.
- Внесите
rowCount
и укажите сумму всех строк моделей.
- Внесите
columnCount
и укажите количество столбцов в ваших моделях.
- Внедрение
index
, return createIndex (строка, столбец, NULL);
- Внесите
parent
, return QModelIndex(); Я надеюсь, что ваши модели не являются деревьями
- Внесите
data
, setData
и т.д., обращаясь к нужной модели. Используйте методы из # 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();
}
Что означает «объединить все myItemModel в одном myItemModel»? Просьба уточнить. – vahancho
Я хочу одну модель boig, которая включает в себя все другие модели. – user2699453
Не думаю, что это возможно. Модель элемента - это не простой набор элементов, но определяет функциональность. Как вы собираетесь сочетать функциональность? – vahancho