combine QAbstractItemModels



我有一个map = std::map<std::string, myItemModel *>,其中myItemModel继承了QAbstractItemModel

我现在想把所有的myItemModel组合成一个单独的myItemModel(每隔一个项目模型也可以)。因此存在一个大的CCD_ 6。

有没有"qt方法"可以做到这一点?

这是可以做到的,但并非微不足道。这取决于您对QAbstractItemModel的实现,这就是为什么它没有在Qt中完成。

以下是实现模型集合的步骤:

  1. 创建从QAbstractItemModel继承的新类
  2. 添加方法以向其中添加其他模型
  3. 处理来自包含索引的子模型的所有信号(您需要更改它们,参见#10)
  4. 转发所有不包含索引的信号
  5. 实现rowCount并提供所有模型行的总和
  6. 实现columnCount并在模型中提供多个列
  7. 实现index返回createIndex(行、列、NULL)
  8. 实现parent返回QModelIndex()
  9. 实现对正确模型的datasetData等寻址调用。使用#10中的方法转换索引
  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或更高版本许可的。

相关内容

  • 没有找到相关文章

最新更新