web-dev-qa-db-ja.com

QTableViewの列が最大にサイズ変更されることを確認する方法

どうすればいいのかわからないので、お気軽にご相談ください。

tableView->resizeColumnsToContents()は、現在のビューのデータに基づいてすべての列のサイズのみを変更するようです。つまり、以下のデータが多い場合(単語数の点で長い場合)、それらの単語は折り返されます(wordWrapプロパティがtrueに設定されている場合)。

奇妙なことに、一番下までスクロールしてデータを更新すると、tableViewがこれらの列のサイズを正しく変更します。 tableViewが下に長いテキストがあることを知らなかったかのようです。

だから、私の質問は、これらの列がすべてのデータに基づいて最大にサイズ変更されていることを確認するにはどうすればよいですか?

私のコード

_QSqlTableModel *model = new QSqlTableModel;
model->setTable("item");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select();    
tableResult->setModel(model);    
tableResult->setEditTriggers(QAbstractItemView::NoEditTriggers);    
tableResult->setSelectionBehavior(QAbstractItemView::SelectRows);
tableResult->setSelectionMode(QAbstractItemView::SingleSelection);    
tableResult->resizeColumnsToContents();
tableResult->resizeRowsToContents();
_

更新1

私はtableResult->scrollToBottom()を試しましたが、下部の項目に基づいてのみサイズ変更されます。したがって、途中に長い単語がある場合、それらの単語は折り返されます。

更新2

誰かが私が話していることを理解したいのであれば、ちょうど ダウンロード この例。プッシュボタンをクリックすると、正しくサイズ変更されないデータが生成されることがわかります。

更新3

おそらくバグ: https://bugreports.qt.io/browse/QTBUG-9352

29
amree

この問題の回避策を見つけることができました。resizeColumnsToContents()を呼び出す前にテーブルを非表示にするだけです。

例として:

tableResult->setVisible(false);
tableResult->resizeColumnsToContents();
tableResult->setVisible(true);
40
amree

これは、QSqlTableModelがオンデマンドでデータをロードし、ビューが使用可能なデータのみに基づいて列幅を計算するためだと思います。列をユーザーがサイズ変更できるようにする必要がない場合は、これを試すことができます。

tableResult->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents);
6
andref

Amreeが説明したのと同じ回避策を使用しましたが、列の幅に適していますが、オフスクリーンの列に複数行のセルがあり、行の高さが高くなると、tableView->resizeRowsToContents()が正しく機能しませんでした。

Qtソースを調べましたが、一部の計算はビューポートのジオメトリに依存しているようです。これは列と行の両方ですべてが正しく機能するようです:

#include <limits>

tableView->setVisible(false);
QRect vporig = tableView->viewport()->geometry();
QRect vpnew = vporig;
vpnew.setWidth(std::numeric_limits<int>::max());
tableView->viewport()->setGeometry(vpnew);
tableView->resizeColumnsToContents();
tableView->resizeRowsToContents();
tableView->viewport()->setGeometry(vporig);
tableView.setVisible(true);
4
dougg3