我有map = std::map<std::string, myItemModel *>
,其中myItemModel
继承QAbstractItemModel
。
我现在想要将所有myItemModel
合并到一个myItemModel
中(每个其他项目模型也可以)。
所以有一个很大的myItemModel
。
这样做是否有'qt-way'?
答案 0 :(得分:3)
可以做到,但这不是微不足道的。这取决于你QAbstractItemModel
的实现,这就是为什么它没有在Qt中完成。
以下是实现模型集合的步骤:
QAbstractItemModel
rowCount
并提供所有模型行的总和。 columnCount
并在模型中提供多个列。 index
,返回createIndex(行,列,NULL); parent
,返回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();
}
答案 1 :(得分:2)
KDE Frameworks项目包含一个名为KItemModels的模块,其中包括一个名为KConcatenateRowsProxyModel的类。它确实完全符合您的要求。该库每月作为[KDE Frameworks版本]的一部分发布,代码在unit tested上连续https://build.kde.org。所有这些都根据LGPL v2或更高版本授权。