web-dev-qa-db-fra.com

QListWidget ajuste la taille au contenu

Est-il possible d'ajuster la hauteur et la largeur de QListWidget à son contenu?

sizeHint() renvoie toujours 256, 192 Quel que soit son contenu.
QListWidgetItemsizeHint() 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.

enter image description here

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_())
34
Qiao

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
45
gwohpq9

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_()
8
Trilarion

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.

2
Thadeux