CODE:QTableWidgetが移入され初めて、すべてが正常ですが、私はそれを再作成するとき、それはかなり遅いです
populateTable()
{
tableWidget->clearContents();
tableWidget->setRowCount(stringList.size());
for(int i = 0; i < stringList.size(); ++i)
{
tableWidget->setItem(i, 0, new QTableWidgetItem(stringList.at(i)));
}
}
問題:
初めてpopulateTable( )が実行されても、すべて正常です。しかし、次の結果として、以前より大幅に遅くなります。
議論:
は慎重にテストの後、私は問題である)(clearContentsを疑います。単純に
tableWidget->clearContents();
からコードを変更するため、次
tableWidget->setRowCount(0);
修正問題が、今では別の問題になります。行数を '0'に設定すると、割り当てられたヒープQTableWidgetItemsが削除されないように見えますが、アイテムの所有権が残っているように見えるので、メモリリークが発生します。 (または少なくとも私はそう考えています...)
QTableWidgetのQtのドキュメントはかなり漠然としているので、clearContents()が実際に何をしているのか正確には分かりません。ドキュメントでは、「ビューからヘッダーにないすべてのアイテムを削除します」というメッセージが表示されるので、テーブルの内容は隠すだけですか?それは削除されますか?私は確信していません。私の理論では、clearContents()はアイテムのみを隠すだけで、テーブルを作成しようとすると、実際には各アイテムが削除されて削除され、テーブルに設定する新しいアイテムが割り当てられます。
QtableWidgetに関するQtのドキュメントによれば、QTableWidgetを実装する適切な方法は、ヒープにQTableWidgetItemを割り当て、setItem()を使ってテーブルセルに設定することです。私は要約すると
...奇妙なことを見つける:
移入し、これらの問題のすべてを持つことなく、Qtのテーブルを再移植するための別の方法はありますか?もしそうでなければ、これらの問題を解決する方法はありますか?
はい、私は必要なだけで何も使用していないスタンドアロンを作成しました。 QTableWidgetを4列と100行で完全に埋めるテストプログラムを作成しました。 QElapsedTimerを使用して、処理を完了するのにかかる時間を測定しました。 まず、clearContents()を使用して、再投入しようとするとかなり遅くなることがわかりました。次に、私はsetRowCount(0)を使用して、テーブルを再投入するのにかかる時間も、約15msの差異を設定するのにかかる時間に等しいことを発見しました。 あなたが提供したリンクが参考になる場合は、clearContents()の定義につなげることができますか? –
ああ、clearContents()の定義については気にせず、見つけました。 –