使用Qt表视图显示大数据

时间:2013-08-24 18:08:53

标签: c++ qt

我不确定如何处理这个大数据问题。不建议使用Table Widget,而是建议使用Table View来获取大数据的速度。数据最多为200000行乘300列字符串。此外,它可能在结构上有缺口。对于View,需要定义Model。我还没能做到这一点,我想知道以下内容:

如果用户只想替换列中的某些值并检查数据,那么使用View真的会更快吗?鉴于速度需求,QList是一个明智的选择,还是有更好的选择?以及如何将其作为模型实现?

1 个答案:

答案 0 :(得分:3)

QTableWidget使用自己的Model作为后端(其数据的容器)。一个人不能(或者不应该有人应该)定制QTableWidget的模型。 QTableWidget中的每个单元格由QTableWidgetItem表示。它们是为解决一般问题而编写的,并不是那么快。

当一个人决定使用QTableView时,它自己的模型派生自QAbstractTableModel作为后端,可以加速分配。我发现处理时间最长的事情之一就是行的大小计算。我在我的表中重载了sizeHintForRow,如下所示:

int MyTable::sizeHintForRow ( int row ) const
{
  //All rows have the same height in MyTable, hence we use the height of the
  // first row for performance reasons.
  if( cachedRowSizeHint_ == -1 )
  {
    cachedRowSizeHint_ =
        model()->headerData( 0, Qt::Vertical, Qt::SizeHintRole ).toSize().height();
  }
  return cachedRowSizeHint_;
}

实现简单的表模型非常简单(Qt帮助文件足够......)。可以从提供最小角色(编辑和显示)的数据开始。必要时,可以使用QIdentityProxyModels修改TableModel数据。如果您的模型不起作用,请发布您的代码。请记住不要为角色返回无效数据,例如:

QVariant IO_PluginMngr::data(const QModelIndex & index, int role) const
{
  if( index.isValid() )
  {
    if( role == Qt::DisplayRole)
    {
      return sequence_[index.row()][index.column()];
    }
  }
  return QVariant();
}

返回例如特别是SizeHintRole的错误数据将导致视图中的混乱。

我注意到,在实现模型时,应该在适当时调用begin / endInsertRows,否则持久模型索引不起作用。

我们编写了更复杂的表,其中数据在后台的线程中被修改,并在更新表之前被换出。其中一个可以提高速度的领域是永远不会在模型中对数据进行排序,而是使用引用真实(无序)数据的有序引用序列。我们有大约一千行和50列的表,每秒更新一次(有很多视图),处理器的处理器大约占20%,但最大的速度提升是sizeHint的缓存。 p>