1

我不确定如何解决这个大数据问题。建议不要使用 Table Widget,而是使用 Table View 来处理大数据以提高速度。数据最多为 200000 行乘 300 列字符串。此外,它可能在结构上存在差距。对于视图,需要定义一个模型。我还不能这样做,我想知道以下几点:

如果用户只想替换列中的某些值并检查数据,使用视图真的会更快吗?考虑到速度需求,QList 是明智的选择,还是有更好的选择?以及如何将其实现为模型?

4

1 回答 1

3

QTableWidget 使用自己的模型作为后端(其数据的容器)。不能(或者不应该)自定义 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 帮助文件就足够了......)。可以从提供最低角色(编辑和显示)的数据开始。TableModel 数据始终可以在必要时使用 QIdentityProxyModels 进行修改。如果您的模型不起作用,请发布您的代码。请记住不要为角色返回无效数据,例如:

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,否则持久模型索引不起作用。

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

于 2013-08-24T21:29:56.000 回答