Est-il possible d'ajuster la hauteur et la largeur de QListWidget à son contenu?
sizeHint()
renvoie toujours 256, 192
Quel que soit son contenu.QListWidgetItem
sizeHint()
renvoie -1, -1
, donc je ne peux pas obtenir la largeur du contenu.
Problème le même qu'ici - http://www.qtcentre.org/threads/31787-QListWidget-width , mais il n'y a pas de solution.
import sys
from PyQt4.QtGui import *
class MainWindow(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
list = QListWidget()
list.addItem('111111111111111')
vbox = QVBoxLayout(self)
vbox.addWidget(list)
app = QApplication(sys.argv)
myapp = MainWindow()
myapp.show()
sys.exit(app.exec_())
sizeHint () renvoie toujours 256, 192 quel que soit son contenu.
C'est parce que c'est la taille de QListWidget, la fenêtre, pas les éléments. sizeHintForColumn () vous donnera la taille maximale de tous les éléments, vous pouvez donc redimensionner le widget comme ceci:
list.setMinimumWidth(list.sizeHintForColumn(0))
Si vous ne voulez pas forcer la largeur minimale, alors sous-classe et fournissez cela comme indice de taille à la place. Par exemple.:
class ListWidget(QListWidget):
def sizeHint(self):
s = QSize()
s.setHeight(super(ListWidget,self).sizeHint().height())
s.setWidth(self.sizeHintForColumn(0))
return s
En utilisant takois réponse J'ai joué avec sizeHintForColumn
ou sizeHintForRow
et j'ai constaté que vous deviez ajouter des nombres légèrement plus grands, car il pouvait y avoir encore des marges dépendantes du style. ekhumoros commentaire alors mettez-moi sur la bonne voie.
En bref, la taille complète du widget de liste est:
list.sizeHintForColumn(0) + 2 * list.frameWidth()
list.sizeHintForRow(0) * list.count() + 2 * list.frameWidth())
Selon le commentaire de Violet, cela peut ne pas fonctionner dans Qt 5.
Sachez également qu'en définissant la taille du contenu, vous n'avez pas besoin de barres de défilement, donc je les désactive.
Mon exemple complet pour un QListWidget
ajusté à sa taille de contenu:
from PySide import QtGui, QtCore
app = QtGui.QApplication([])
window = QtGui.QWidget()
layout = QtGui.QVBoxLayout(window)
list = QtGui.QListWidget()
list.addItems(['Winnie Puh', 'Monday', 'Tuesday', 'Minnesota', 'Dracula Calista Flockhart Meningitis', 'Once', '123345', 'Fin'])
list.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
list.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
list.setFixedSize(list.sizeHintForColumn(0) + 2 * list.frameWidth(), list.sizeHintForRow(0) * list.count() + 2 * list.frameWidth())
layout.addWidget(list)
window.show()
app.exec_()
Afin d'utiliser efficacement sizeHint, vous devez le remplacer, au moins en c ++. D'après mon expérience, les implémentations par défaut des widgets peuvent être assez inutiles lorsque vous souhaitez un comportement spécifique. Les tentatives de forcer ce que vous voulez avec des entretoises ou des dispositions se terminent par un désastre. Si vous pouvez dériver de QListWidget et remplacer sizeHint, vous pouvez parcourir vos éléments et trouver la chaîne la plus longue, puis faire une sorte de magie pour déterminer sa largeur.
C'est ce que je ferais de toute façon.