2010-09-10 11 views
6

Comment modifier le comportement d'un QListWidget afin qu'il redimensionne sa hauteur au lieu de choisir une hauteur (apparemment arbitraire) et d'ajouter des barres de défilement? Voir capture d'écran:QListWidget qui redimensionne à la place des parchemins

screen shot

Les QListView de doivent remplir autant d'espace horizontal car ils peuvent (créer autant de « colonnes » si vous préférez.) Ensuite, ils enveloppent et faire autant de lignes que nécessaire pour adapter tous les articles. Ces calculs doivent être ajustés lorsque la fenêtre est redimensionnée. Tout cela fonctionne très bien.

Cependant, ce que je veux arriver est que, au lieu de la hauteur restant la même, la QListView devrait augmenter ou diminuer verticalement et jamais besoin de barres de défilement. Le défilement, si nécessaire, sera géré sur le parent QWidget qui héberge toutes les étiquettes et listes. Il semble qu'une fois la hauteur du QListWidget établie (je ne sais pas d'où vient sa valeur par défaut), elle ne change jamais. Il est trop grand dans certains cas (voir le deuxième « test » liste ci-dessus) et trop petit dans d'autres (voir premières « cartes blanches » liste ci-dessus.)

La mise en page est rien d'étonnant au-dessus: deux QLabel « s et deux QListWidget « s dans un QVBoxLayout. Voici les propriétés que je l'ai mis sur les QListWidget » s:

setMovement(QListView::Static); 
setResizeMode(QListView::Adjust); 
setViewMode(QListView::IconMode); 
setIconSize(QSize(128, 128)); 

(je l'ai déjà essayé de placer les politiques de scrollbar horizontale et verticale, mais qui tourne juste la barre de défilement au large, clipsage du contenu non. ce que je veux.)

Répondre

3

Peut-être que vous pourriez cela sans utiliser QListWidget. Les exemples du Qt contiennent une nouvelle classe, QFlowLayout, qui pourrait être utile. Avec le type de hiérarchie de widgets suivant, vous pourriez obtenir plusieurs groupes avec des étiquettes et ils seraient tous dans une QScrollArea.

QScrollBox 
    QVBoxLayout 

    QLabel "Blank maps" 
    QWidget 
     QFlowLayout 
      your own widgets showing map images and labels 

    QLabel "Text" 
    QWidget 
     QFlowLayout 
      your own widgets 

Le problème est que ce type de solution créerait beaucoup plus de widgets que la solution basée sur QListWidget. Donc, si vous avez des centaines d'éléments dans votre liste, cela pourrait ne pas être la meilleure solution.

+1

OK, c'est très, très proche. Cela fonctionne très bien tant que QScrollBox n'est pas dans l'image. Dès que j'ajoute cela, le QVBoxLayout devient aussi mince que possible et aussi longtemps que possible. (Il retourne sizeHint de QSize (197, 942).J'ai essayé toutes les combinaisons de QWidget :: setSizePolicy et QLayout :: setSizeConstraint auxquelles je peux penser, et rien ne change ce comportement. Quel est le secret? –

+1

'QScrollArea :: setWidgetResizable()' POUR. LA. WIN !!! Merci beaucoup pour votre aide ... J'ai perdu 2 jours à faire cette piste de lapin QListWidget. –

3

Il y a une fonction membre protégée appelée contentsSize() dans QListView. Il est utilisé pour calculer les minimum() requis, maximum() et pageStep() pour les barres de défilement (comme mentionné here).

Pouvez-vous sous-classer la classe QListView et utiliser cette information? Je vous suggère de recalculer la taille de votre widget dans la même fonction où vous y ajoutez du contenu. Bien que manquant un peu d'élégance, cela semble être une solution assez fiable.

+0

Cette propriété semble utile, mais je ne sais pas vraiment comment l'utiliser. Avec cette taille, quelle méthode puis-je appeler sur le QListWidget pour le forcer à être cette valeur? (Ou changer le sizeHint?) Désolé, relativement nouveau à Qt ici, et c'est très obscur pour moi. Merci de votre aide! –

+0

Vous pouvez définir 'sizeHint' à cette taille et définir' sizeHintPolicy' sur 'Fixed'; ou utilisez la méthode 'setGeometry()'. Disclaimer: Je n'ai pas testé ce que je propose ici, mais je suis assez confiant que cela fonctionnera. – dpq

+4

J'ai hérité de 'QListWidget' et réimplémenté' sizeHint() 'pour retourner' contentsSize() '. Ça marche! Merci. – swongu

Questions connexes