2010-09-10 9 views
6

¿Cómo se cambia el comportamiento de un QListWidget de modo que cambia el tamaño de su altura en lugar de elegir una altura (aparentemente arbitraria) y la adición de barras de desplazamiento? Ver imágen:QListWidget maneja el tamaño en lugar de rollos

screen shot

Los QListView 's deben llenar tanto espacio horizontal, ya que pueden (la creación de la mayor cantidad de 'columnas', si se quiere.) A continuación, se envuelven y hacen tantas filas como sea necesario adaptarse a todos los elementos. Estos cálculos deben ajustarse a medida que se cambia el tamaño de la ventana. Esta todo trabajando bien.

Sin embargo, lo que yo quiero a pasar es que en vez de la altura se mantiene igual, el QListView debe ampliarse o reducirse en forma vertical y no necesita ninguna barras de desplazamiento. El desplazamiento, si es necesario, se manejará en el padre QWidget que alberga todas las etiquetas y listas. Parece que una vez que se establece la altura del QListWidget (no estoy seguro de dónde viene su valor predeterminado), nunca cambia. Es demasiado grande en algunos casos (véase la segunda lista de "prueba" más arriba) y demasiado pequeños en otros (véase el primer "mapas en blanco" lista anterior.)

La disposición anterior es nada sorprendente: dos QLabel 's y dos QListWidget 's en un QVBoxLayout. Estas son las propiedades que ha configurado en el QListWidget' s:

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

(ya he intentado establecer las políticas de la barra de desplazamiento horizontal y vertical, sino que simplemente hace girar las barras de desplazamiento fuera, recorte el contenido no. lo que quiero.)

Respuesta

3

tal vez usted podría esto sin usar QListWidget. Los ejemplos de Qt contienen una nueva clase de diseño, QFlowLayout, que podría ser útil. Con el siguiente tipo de jerarquía de widgets, puedes obtener múltiples grupos con etiquetas y todos estarán dentro de un QScrollArea.

QScrollBox 
    QVBoxLayout 

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

    QLabel "Text" 
    QWidget 
     QFlowLayout 
      your own widgets 

El problema es que este tipo de solución crearía muchos más widgets que la solución basada en QListWidget. Entonces, si tiene cientos de elementos en su lista, esta podría no ser la mejor solución.

+1

OK, esto está muy, muy cerca. Funciona muy bien siempre que QScrollBox no esté en la imagen. Tan pronto como agregue eso, QVBoxLayout se pone lo más delgado posible y mientras pueda. (Está regresando sizeHint of QSize (197, 942).He probado todas las combinaciones de QWidget :: setSizePolicy y QLayout :: setSizeConstraint que puedo pensar, y nada está cambiando ese comportamiento. ¿Cuál es el secreto? –

+1

'QScrollArea :: setWidgetResizable()' FOR. EL. ¡GAN! Muchas gracias por su ayuda ... Perdí 2 días haciendo esa pista de conejo 'QListWidget'. –

3

hay una función miembro protegido llamada contentsSize() en QListView. Se utiliza para calcular el requerido minimum(), maximum(), y pageStep() para las barras de desplazamiento (como se mencionó here).

¿Puede subclase de la clase QListView y hacer uso de esa información? Le sugiero que vuelva a calcular el tamaño de su widget en la misma función donde agrega contenido. Aunque algo falta de elegancia, esta parece ser una solución bastante confiable.

+0

Esa propiedad parece útil, pero realmente no estoy seguro de cómo usarlo. Con ese tamaño, ¿a qué método puedo recurrir en el QListWidget para forzarlo a que sea ese valor? (¿O cambiar el tamaño de Hint?) Lo siento, relativamente nuevo para Qt aquí, y esto es muy oscuro para mí. ¡Gracias por tu ayuda! –

+0

Puede establecer 'sizeHint' a este tamaño y establecer el' sizeHintPolicy' en 'Fixed'; o use el método 'setGeometry()'. Descargo de responsabilidad: no probé lo que propongo aquí, pero estoy bastante seguro de que funcionará. – dpq

+4

Heredé 'QListWidget' y reimplemented' sizeHint() 'para devolver' contentsSize() '. ¡Funciona! Gracias. – swongu

Cuestiones relacionadas