2011-06-13 45 views
28

¿Es posible ajustar QListWidget alto y ancho a su contenido?QListWidget ajustar el tamaño al contenido

sizeHint() siempre devuelve 256, 192 sin importar su contenido.
QListWidgetItemsizeHint() devuelve -1, -1, por lo que no puedo obtener el ancho del contenido.

Problema igual que aquí - http://www.qtcentre.org/threads/31787-QListWidget-width, pero no hay solución.

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

Respuesta

37

sizeHint() siempre devuelve 256, 192 sin importa cuál es su contenido.

Eso es porque este es el tamaño de la QListWidget, la ventana gráfica, no los elementos. sizeHintForColumn() le dará el tamaño máximo sobre todos los artículos, por lo que puede cambiar el tamaño del widget de la siguiente manera:

list.setMinimumWidth(list.sizeHintForColumn(0)) 

Si no desea forzar anchura mínima, a continuación, subclase y proporcionar esto como el tamaño de pista en su lugar. Ej .:

class ListWidget(QListWidget): 
    def sizeHint(self): 
    s = QSize() 
    s.setHeight(super(ListWidget,self).sizeHint().height()) 
    s.setWidth(self.sizeHintForColumn(0)) 
    return s 
+0

Funciona. Solo necesita agregar +5 px para que no haya barra de desplazamiento. ¿Dónde puedo leer sobre viewports? No puedo encontrarlo. – Qiao

+1

Echa un vistazo a QAbstractScrollArea – takoi

+1

Si habrá una barra de sroll vertical, utilice las siguientes dos líneas, después de insertar ListWidget en el diseño deseado: 'list_widget.updateGeometry()' y luego agregue 'list_widget.verticalScrollBar(). Width()' – Jeff

-2

que necesita para obtener la QHeaderView de su QListWidget y ajustar su modo de cambio de tamaño.

leer esta documentación para obtener más información

http://doc.qt.nokia.com/latest/qheaderview.html#ResizeMode-enum

+0

Y dónde puedo leer sobre conseguir la QHeaderView de su QListWidget? No se puede encontrar mencionar el encabezado en los documentos de la lista y sus clases principales. – Qiao

+0

bien olvida el QHeaderView. Después de establecer la política de tamaño, intente configurar el modo de cambio de tamaño en Ajustar [doc] (http://doc.qt.nokia.com/latest/qlistview.html#ResizeMode-enum) – emaillenin

+0

No funciona. 'sizeHint()' siempre devuelve 256, 192, la política de tamaño no puede cambiarlo. – Qiao

2

Para utilizar con eficacia sizeHint, hay que anularlo, por lo menos en C++. En mi experiencia, las implementaciones predeterminadas para widgets pueden ser bastante inútiles cuando quieres un comportamiento específico. Intenta forzar lo que desea con espaciadores o diseños que terminan en un desastre. Si puede derivar de QListWidget y anular sizeHint, puede recorrer sus elementos y buscar la cadena más larga, luego haga algún tipo de magia para determinar qué tan ancho debe ser.

Eso es lo que haría, de todos modos.

-1

Primero debe obtener la cadena más grande de la lista, que es fácil de obtener.

Después de obtener esa cadena, haga lo siguiente:

QFontMetrics * fm = new QFontMetrics(widget->font()); 
QRect rect; 
rect = fm->boundingRect(string); 

rect.width() tiene el ancho en píxeles de la mayor cadena de rect.height() tiene su altura.

Establecer el ancho QListWidget a la anchura de ese rect (además de los márgenes) y su altura a veces la altura de ese rect el número de elementos

no he probado el código, pero espero que lo pone a la derecha realizar un seguimiento de

-1
QListWidget *valList; 

valList = new QListWidget(this); 

valList->setSizePolicy (QSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored)); 
valList->setMinimumSize (QSize(1111, 111)); 
8

Usando takois answer he jugado un poco con el sizeHintForColumn o sizeHintForRow y se encontró que hay que añadir los números un poco más grandes, porque puede haber algunos márgenes dependientes de estilo todavía. ekhumoros comment luego me puso en el camino correcto.

En resumen, el tamaño del widget lista es:

list.sizeHintForColumn(0) + 2 * list.frameWidth() 
list.sizeHintForRow(0) * list.count() + 2 * list.frameWidth()) 

Según la comment por Violeta puede que no funcione en Qt 5.

También tenga en cuenta que el ajuste del tamaño del contenido , no necesita barras de desplazamiento, entonces los apago.

Mi llena ejemplo para un QListWidget ajusted a su tamaño contenido:

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_() 
+0

Si alguien encuentra una mejor expresión para los márgenes faltantes, coméntelo aquí. – Trilarion

+1

Solo necesita agregar 'list.frameWidth() * 2' al ancho y alto para obtener el tamaño total correcto. – ekhumoro

+0

@ekhumoro Muchas gracias por la ayuda. Lo incluí en la respuesta. – Trilarion

Cuestiones relacionadas