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