我有一个map = std::map<std::string, myItemModel *>
,其中myItemModel
继承了QAbstractItemModel
。
我现在想把所有的myItemModel
组合成一个单独的myItemModel
(每隔一个项目模型也可以)。因此存在一个大的CCD_ 6。
有没有"qt方法"可以做到这一点?
这是可以做到的,但并非微不足道。这取决于您对QAbstractItemModel
的实现,这就是为什么它没有在Qt中完成。
以下是实现模型集合的步骤:
- 创建从
QAbstractItemModel
继承的新类 - 添加方法以向其中添加其他模型
- 处理来自包含索引的子模型的所有信号(您需要更改它们,参见#10)
- 转发所有不包含索引的信号
- 实现
rowCount
并提供所有模型行的总和 - 实现
columnCount
并在模型中提供多个列 - 实现
index
,返回createIndex(行、列、NULL) - 实现
parent
,返回QModelIndex()- 实现对正确模型的
data
、setData
等寻址调用。使用#10中的方法转换索引- 创建将子模型索引转换为基础模型索引并返回的方法
- 实现对正确模型的
示例(索引):基本模型ChildModel1 ChildModel20,00,01,0 1,02,0,03,0,1.04,0,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();
}
KDE Frameworks项目包含一个名为KItemModels的模块,其中包含一个称为KConcatenateRowsProxyModel的类。它做正是你想要的。该库作为[KDE Frameworks发布版]的一部分每月发布,代码在https://build.kde.org.所有这些都是根据LGPL v2或更高版本许可的。