web-dev-qa-db-fra.com

Comment vous assurer que les colonnes de QTableView sont redimensionnées au maximum

Je ne sais pas comment demander cela, alors n'hésitez pas à demander plus d'informations.

Il semble que tableView->resizeColumnsToContents() ne redimensionne que toutes les colonnes en fonction des données de la vue actuelle. Ce qui signifie que si j'ai plus de données ci-dessous (ce qui est plus long en termes de nombre de mots), ces mots seront encapsulés (si la propriété wordWrap est définie sur true).

La chose étrange est que si je fais défiler vers le bas et actualise les données, tableView redimensionnera correctement ces colonnes. Il semble que tableView ne savait pas qu'il y a un texte plus long ci-dessous.

Donc, ma question est, comment puis-je m'assurer que ces colonnes sont redimensionnées au maximum en fonction de toutes les données?

Mes codes

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();

Mise à jour 1

J'ai essayé tableResult->scrollToBottom() et il ne sera redimensionné qu'en fonction des éléments en bas. Donc, s'il y a des mots plus longs au milieu, ces mots seront enveloppés.

Mise à jour 2

Si quelqu'un veut comprendre de quoi je parle, juste téléchargement cet exemple. Vous verrez que cliquer sur le bouton poussoir générera des données qui ne sont pas redimensionnées correctement.

Mise à jour 3

Peut-être un bogue: https://bugreports.qt.io/browse/QTBUG-9352

29
amree

J'ai réussi à trouver une solution de contournement pour ce problème, il vous suffit de masquer la table avant d'appeler resizeColumnsToContents().

À titre d'exemple:

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

Je pense que c'est parce que QSqlTableModel charge les données à la demande et la vue calcule les largeurs de colonne en fonction uniquement des données disponibles. Si vous n'avez pas besoin que vos colonnes soient redimensionnables par l'utilisateur, vous pouvez essayer ceci:

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

J'ai utilisé la même solution de contournement que celle décrite par amree, qui fonctionnait très bien pour les largeurs de colonne, mais tableView->resizeRowsToContents() ne fonctionnait pas correctement si des colonnes hors écran avaient des cellules multilignes qui auraient dû augmenter la hauteur d'une ligne.

J'ai regardé la source Qt et il semble que certains calculs dépendent de la géométrie de la fenêtre. Cela semble faire tout fonctionner correctement pour les colonnes et les lignes:

#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