2010-08-08 14 views
27

Je ne suis pas sûr de savoir comment poser cette question, alors, n'hésitez pas à demander plus d'informations.Comment vous assurer que les colonnes de QTableView sont redimensionnées au maximum

Il semble que tableView->resizeColumnsToContents() redimensionnera uniquement toutes les colonnes en fonction des données de la vue en cours. 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 fermés (si la propriété wordWrap est définie sur true). La chose étrange est, si je fais défiler vers le bas et actualise les données, tableView va redimensionner ces colonnes correctement. Il semble que si tableView ne savait pas il y a plus de texte 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(); 

Update 1

J'ai essayé tableResult->scrollToBottom() et il ne Redimensionner 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 ce dont je parle, juste download cet exemple. Vous verrez que cliquer sur le PushButton va générer une donnée qui n'est pas redimensionnée correctement.

Mise à jour 3

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

+0

J'ai aussi ce problème. seules les lignes visibles sont redimensionnées. Avez-vous déjà trouvé une solution pour cela? – ComputerEngineer88

Répondre

38

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

Pour un exemple:

tableResult->setVisible(false); 
tableResult->resizeColumnsToContents(); 
tableResult->setVisible(true); 
+1

+1 Beautifül!Je n'aurais jamais pensé à ça ... –

+1

Etrangement, 'table.resizeColumnsToContents()' fonctionne sans cacher/afficher la table avec PyQt5 – zdimension

+2

Dans Qt 5.6 aussi 'table.resizeColumnsToContents()' fonctionne sans cacher/montrer la table – Indraraj

5

Je pense que c'est parce que les charges QSqlTableModel données sur la demande et la vue calcule la largeur des colonnes à base uniquement sur des données qui sont disponibles. Si vous n'avez pas besoin de vos colonnes pour être redimensionnable utilisateur, vous pouvez essayer ceci:

tableResult->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents); 
+0

Ça ne marche pas. La colonne ne se redimensionne toujours pas correctement. Je mets le code à la fin de la fonction. J'ai également essayé QList comme source des données avec QStandardItemModel comme modèle. – amree

4

J'ai utilisé la même solution que décrit par amree, qui a travaillé beaucoup pour la largeur des colonnes, mais tableView->resizeRowsToContents() ne fonctionnait pas correctement si les colonnes hors écran ont des cellules multilignes qui devraient avoir causé la hauteur d'une rangée à augmenter.

J'ai regardé dans la source Qt et il semble que certains des calculs dépendent de la géométrie de la fenêtre. Cela semble rendre tout fonctionne 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); 
+2

La réponse d'amree m'a aidé, mais j'ai rencontré un problème avec la taille automatique des rangées en même temps et j'ai pensé qu'il serait utile pour les futurs lecteurs de poster ma solution à ce problème étroitement lié. Un peu plus que "essentiellement rien", dirais-je. – dougg3

+0

Excellent, j'ai essayé de résoudre ce problème depuis si longtemps! –