2

私はQtTableWidget7列と多くの行を持っています(2000のようなものですが、5000以上になるでしょう)。

このデータはデータベースから取得されます。クエリと後処理にかかった時間は 100 ミリ秒未満だったので、これは問題ではありません。

しかし、アイテムをテーブルに挿入するには、7x2000 アイテムの場合、かなりの時間がかかります (30 秒程度)。

できる限りコードを最適化しようとしましたが、もうどうすればよいかわかりません。

また、アプリケーションが起動されると、同じデータ セットを持つこの同じテーブルが非常に高速に読み込まれることに注意する必要があります。したがって、これはレンダリングの問題だと思います。

setUpdatesEnabledレンダリングをブロックするものをドキュメントで検索したところ、まったく役に立たない方法を思いつきました。

以下は、テーブルを作成するために使用しているコードです。

setUpdatesEnabled(false);
blockSignals(true);
bool sort = isSortingEnabled();
setSortingEnabled(false);
// rebuild headers.
buildHeaders(); // take less than 1ms.
// rebuild grid.
int oldRowCount = rowCount();
setRowCount(sml->length()); // take less than 1ms.
ListIterator<StoredMetadata> it(sml); // sml is a list with the data to be displayed.
int row = 0;
while ( it.hasNext() ) {
    AudioLife::StoredMetadata *sm = it.next();
    if ( row >= oldRowCount ) {
        setItem(row, 0, new QTableWidgetItem(sm->artist));
        setItem(row, 1, new QTableWidgetItem(sm->album));
        setItem(row, 2, new QTableWidgetItem(sm->name));
        setItem(row, 3, new QTableWidgetItem(sm->number > 0 ? QString().setNum(sm->number) : ""));
        setItem(row, 4, new QTableWidgetItem(sm->year > 0 ? QString().setNum(sm->year) : ""));
        setItem(row, 5, new QTableWidgetItem(sm->genre));
        // commenting the following line does not improve performance.
        verticalHeader()->resizeSection(row, defaultRowHeight());
    } else {
        item(row, 0)->setText(sm->artist);
        item(row, 1)->setText(sm->album);
        item(row, 2)->setText(sm->name);
        item(row, 3)->setText(sm->number > 0 ? QString().setNum(sm->number) : "");
        item(row, 4)->setText(sm->year > 0 ? QString().setNum(sm->year) : "");
        item(row, 5)->setText(sm->genre);
    }
    item(row, 0)->setData(Qt::UserRole, QVariant(sm->id));
    row++;
}
setUpdatesEnabled(true);
blockSignals(false);
setSortingEnabled(sort);

誰にも手がかりはありますか?

4

1 に答える 1

2

テーブルモデルのサブクラス化を検討QSqlTableModelQSqlQueryModel、ウィジェットのアイテムを手動で挿入/設定する代わりに、フレームワークにアイテムを表示させます

[編集]: またはQSqlTableModel、テーブル モデルとして直接使用する

参照: Using-QSqlTableModel-To-Display-an-SQL-viewQSQLTableModel 継承者と QTableView、およびいくつかのサンプル コードはこちら

于 2013-05-29T06:56:47.567 に答える