QListWidget che ridimensiona, invece di rotoli
-
02-10-2019 - |
Domanda
Come si fa a cambiare il comportamento di un QListWidget
in modo che ridimensiona la sua altezza invece di scegliere una (apparentemente arbitrario) di altezza e l'aggiunta di barre di scorrimento? Visualizza gli screenshot:
Gli anni QListView
deve riempire lo stesso spazio in orizzontale in quanto possono (creando il maggior numero di "colonne", se si vuole.) Poi avvolgere e fare tante righe quante necessarie per adattarsi a tutte le voci. Questi calcoli devono essere regolati quando la finestra viene ridimensionata. Questo è tutto bene a lavorare.
Tuttavia, quello che vogliono per accadere è che invece di l'altezza rimanere lo stesso, il QListView
dovrebbe crescere o restringersi in verticale e mai bisogno eventuali barre di scorrimento. Lo scorrimento, se necessario, sarà gestita sulla QWidget
genitore che ospita tutte le etichette e gli elenchi. Sembra che una volta stabilita l'altezza del QListWidget
(non sono sicuro dove la sua impostazione predefinita è venuta da), non cambia mai. E 'troppo grande, in alcuni casi (vedi seconda lista "Test" di cui sopra) e troppo piccola in altri (vedi prima "vuoto Maps" lista di cui sopra.)
Il layout di cui sopra è nulla di sorprendente: due di QLabel
e due QListWidget
di in un QVBoxLayout.
Qui ci sono le proprietà che ho impostati del QListWidget
:
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.)
Soluzione
Forse si potrebbe questo senza usare QListWidget. esempi del Qt contengono una nuova classe di layout, QFlowLayout, che potrebbe essere utile. Con il seguente tipo di widget di gerarchia si potrebbe ottenere più gruppi con etichette e tutti sarebbe all'interno di una 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 molto di più widget di soluzione basata QListWidget. Quindi, se avete centinaia di oggetti nella vostra lista, questo potrebbe non essere la soluzione migliore.
Altri suggerimenti
C'è una funzione di membro protetta denominata contentsSize()
in QListView
. E 'utilizzato per calcolare la minimum()
richiesta, maximum()
, e pageStep()
per le barre di scorrimento (come detto qui ).
Si può creare una sottoclasse della classe QListView
e fare uso di queste informazioni? Vi suggerisco di ricalcolare la dimensione del vostro widget nella stessa funzione in cui si aggiungono i contenuti ad esso. Mentre un po 'carente eleganza, questo sembra essere una soluzione abbastanza affidabile.