结合QAbstractItemModel

时间:2014-09-04 09:13:32

标签: qt qabstractitemmodel

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

我现在想要将所有myItemModel合并到一个myItemModel中(每个其他项目模型也可以)。 所以有一个很大的myItemModel

这样做是否有'qt-way'?

2 个答案:

答案 0 :(得分:3)

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

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

  1. 创建一个继承自QAbstractItemModel
  2. 的新类
  3. 添加方法以将其他模型添加到
  4. 处理来自包含索引的子模型的所有信号(您需要更改它们,看看#10)
  5. 转发所有不包含索引的信号。
  6. 实施rowCount并提供所有模型行的总和。
  7. 实施columnCount并在模型中提供多个列。
  8. 实施index返回createIndex(行,列,NULL);
  9. 实施parent返回QModelIndex(); 我希望您的模型不是树
  10. 实施datasetData等来解决对正确模型的调用问题。使用#10中的方法转换索引。
  11. 创建将子模型索引转换为基本模型索引并返回的方法。
  12.      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或更高版本授权。