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 のキャッシングでした。