2010-09-10 9 views
6

Come si modifica il comportamento di un QListWidget in modo che ridimensioni l'altezza anziché scegliere un'altezza (apparentemente arbitraria) e l'aggiunta di barre di scorrimento? Visualizza gli screenshot:QListWidget che ridimensiona invece di pergamene

screen shot

I QListView 's deve riempire lo stesso spazio in orizzontale in quanto possono (creando il maggior numero di 'colonne', se si vuole.) Poi si avvolgono e fanno tante righe se necessario per misura tutti gli articoli. Questi calcoli dovrebbero essere regolati man mano che la finestra viene ridimensionata. Funziona tutto bene.

Tuttavia, quello che voglio che accada è che invece di l'altezza rimanere lo stesso, il QListView dovrebbe crescere o restringersi in verticale e mai bisogno eventuali barre di scorrimento. Lo scrolling, se necessario, verrà gestito sul genitore QWidget che ospita tutte le etichette e gli elenchi. Sembra che una volta stabilita l'altezza dello QListWidget (non si sa da dove provenga il suo valore predefinito), non cambia mai. In alcuni casi è troppo grande (vedi la seconda lista "Test" sopra) e troppo piccola in altri (vedi la prima lista di "mappe vuote" sopra).

Il layout sopra non è sorprendente: due QLabel e due QListWidget 's in una QVBoxLayout. Qui ci sono le proprietà che ho impostati sulle QListWidget' s:

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

(ho già provato a installare le politiche barra di scorrimento orizzontale e verticale, ma che appena gira le barre di scorrimento fuori, ritaglio il contenuto non. quello che voglio.)

risposta

3

Forse potresti farlo senza usare QListWidget. Gli esempi di Qt contengono una nuova classe di layout, QFlowLayout, che potrebbe essere utile. Con il seguente tipo di gerarchia di widget è possibile ottenere più gruppi con etichette e tutti si troveranno all'interno di un QScrollArea.

QScrollBox 
    QVBoxLayout 

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

    QLabel "Text" 
    QWidget 
     QFlowLayout 
      your own widgets 

Il problema è che questo tipo di soluzione creerebbe molti più widget rispetto alla soluzione basata su QListWidget. Quindi se hai centinaia di articoli nella tua lista, questa potrebbe non essere la soluzione migliore.

+1

OK, questo è molto, molto vicino. Funziona benissimo finché il QScrollBox non è nella foto. Non appena aggiungo questo, il QVBoxLayout diventa più magro possibile e il più a lungo possibile. (Restituisce sizeHint di QSize (197, 942).Ho provato ogni combinazione di QWidget :: setSizePolicy e QLayout :: setSizeConstraint a cui posso pensare, e nulla sta cambiando questo comportamento. Qual'è il segreto? –

+1

'QScrollArea :: setWidgetResizable()' FOR. IL. VINCI !!! Grazie mille per il tuo aiuto ... Ho perso 2 giorni facendo giu 'il sentiero del coniglio di 'QListWidget'. –

3

C'è una funzione membro protetta chiamata contentsSize() in QListView. Viene utilizzato per calcolare lo, maximum() e pageStep() richiesto per le barre di scorrimento (come indicato here).

È possibile creare una sottoclasse della classe QListView e utilizzare tali informazioni? Ti suggerisco di ricalcolare la dimensione del tuo widget nella stessa funzione in cui aggiungi contenuti ad esso. Mentre manca un po 'di eleganza, questa sembra essere una soluzione piuttosto affidabile.

+0

Questa proprietà sembra utile, ma non sono sicuro di come utilizzarla. Con quella dimensione, quale metodo posso chiamare su QListWidget per forzarlo ad essere quel valore? (O cambia il sizeHint?) Scusa, relativamente nuovo per Qt qui, e questo è molto oscuro per me. Grazie per l'aiuto! –

+0

È possibile impostare 'sizeHint' su questa dimensione e impostare' sizeHintPolicy' su 'Fisso'; o usare il metodo 'setGeometry()'. Disclaimer: non ho verificato ciò che sto proponendo qui, ma sono abbastanza fiducioso che funzionerà. – dpq

+4

Ho ereditato 'QListWidget' e reimplementato' sizeHint() 'per restituire' contentsSize() '. Funziona! Grazie. – swongu