1

このビッグデータの問題にどう対処すればよいかわかりません。テーブル ウィジェットを使用する代わりに、高速化のためにビッグ データ用のテーブル ビューを使用することをお勧めします。データは最大 200000 行 x 300 列の文字列になります。また、構造上隙間がある場合があります。ビューの場合、モデルを定義する必要があります。私はまだこれを行うことができませんでした。次のことを疑問に思います。

ユーザーが列の一部の値を置き換えてデータを検査したいだけの場合、ビューを使用する方が本当に速いでしょうか? 速度のニーズを考えると、QList は賢明な選択ですか、それともより良いオプションがありますか? そして、これをモデルとして実装する方法は?

4

1 に答える 1

3

QTableWidget は独自のモデルをバックエンド (データのコンテナー) として使用します。QTableWidget のモデルをカスタマイズすることはできません (またはカスタマイズすることを意図していません)。QTableWidget の各セルは、QTableWidgetItem によって表されます。それらは一般的な問題を解決するために書かれており、それほど速くはありません。

バックエンドとして QAbstractTableModel から派生した独自のモデルで QTableView を使用することを決定した場合、割り当てを高速化できます。最も処理時間がかかったものの 1 つは、行のサイズの計算であることがわかりました。次のように、テーブルで 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 を呼び出すように注意する必要があることに気付きました。そうしないと、永続的なモデル インデックスが機能しません。

データがバックグラウンドのスレッドで変更され、テーブルを更新する前にスワップアウトされる、より複雑なテーブルを作成しました。速度が向上する可能性がある領域の 1 つは、モデル内のデータを並べ替えずに、実際の (順序付けされていない) データを参照する順序付けられた参照シーケンスを使用することです。1 秒に 1 回更新される約 1000 行と 50 列のテーブル (多数のビュー) があり、プロセッサは約 20% 使用されていますが、最大の速度向上は sizeHint のキャッシングでした。

于 2013-08-24T21:29:56.000 に答える