2010-09-10 14 views
6

Wie ändert man das Verhalten eines QListWidget, so dass es seine Höhe ändert, anstatt eine (scheinbar willkürliche) Höhe zu wählen und Bildlaufleisten hinzuzufügen? Screenshot:QListWidget, das die Größe anstelle von Bildlauf ändert

screen shot

Die QListView ist horizontal so viel Platz füllen sollten, da sie können (so viele Schaffung von ‚Spalten‘, wenn man so will.) Dann wickeln sie und so viele Zeilen wie erforderlich machen passen Sie alle Einzelteile an. Diese Berechnungen sollten angepasst werden, wenn das Fenster in der Größe geändert wird. Das funktioniert alles gut.

Was ich jedoch wollen geschehen ist, dass anstelle der Höhe bleiben die gleichen, die QListView sollte vertikal wachsen oder schrumpfen und niemals Scrollbars brauchen. Das Scrollen wird, falls notwendig, auf dem Elternknoten QWidget behandelt, der alle Labels und Listen hostet. Es scheint, als ob die Höhe der QListWidget festgestellt wird (nicht sicher, wo der Standardwert herkommt), es ändert sich nie. Es ist in einigen Fällen zu groß (siehe zweite "Test" -Liste oben) und zu klein in anderen (siehe obenstehende "leere Karten" -Liste).

Das obige Layout ist nicht überraschend: zwei QLabel 's und zwei QListWidget ‚s in einem QVBoxLayout. Hier sind die Eigenschaften I auf den QListWidget gesetzt haben‘ s:

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

(ich schon versucht, die horizontale und vertikale Bildlauf Politik einstellen, aber das stellt sich nur die Bildlaufleisten aus, um den Inhalt Clipping nicht. was ich will.)

Antwort

3

Vielleicht können Sie dies ohne QListWidget verwenden. Die Qt-Beispiele enthalten eine neue Layout-Klasse, QFlowLayout, die nützlich sein könnte. Mit der folgenden Art von Widget-Hierarchie könnten Sie mehrere Gruppen mit Labels erhalten, die sich alle in einem QScrollArea befinden.

QScrollBox 
    QVBoxLayout 

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

    QLabel "Text" 
    QWidget 
     QFlowLayout 
      your own widgets 

Das Problem ist, dass diese Art von Lösung viel mehr Widgets als QListWidget basierte Lösung erstellen würde. Wenn Sie also Hunderte von Elementen in Ihrer Liste haben, ist dies möglicherweise nicht die beste Lösung.

+1

OK, das ist sehr, sehr nah. Es funktioniert gut, solange die QScrollBox nicht im Bild ist. Sobald ich das hinzufüge, wird das QVBoxLayout so dünn wie möglich und so lange es geht. (Es gibt sizeHint von QSize (197, 942) zurück.Ich habe jede Kombination von QWidget :: setSizePolicy und QLayout :: setSizeConstraint ausprobiert, die ich mir vorstellen kann, und nichts ändert dieses Verhalten. Was ist das Geheimnis? –

+1

'QScrollArea :: setWidgetResizable()' FOR. DAS. WIN !!! Vielen Dank für deine Hilfe ... Ich habe 2 Tage verloren, als ich diesen 'QListWidget'-Hasen-Trail hinter mich gebracht habe. –

3

Es gibt eine geschützte Member-Funktion namens contentsSize() in QListView. Es wird verwendet, um die erforderlichen minimum(), maximum() und pageStep() für die Bildlaufleisten zu berechnen (wie erwähnt here).

Können Sie die Klasse QListView unterklassifizieren und diese Informationen verwenden? Ich schlage vor, dass Sie die Größe Ihres Widgets in derselben Funktion neu berechnen, in der Sie ihm Inhalte hinzufügen. Obwohl es etwas an Eleganz fehlt, scheint dies eine ziemlich zuverlässige Lösung zu sein.

+0

Diese Eigenschaft sieht hilfreich aus, aber ich bin mir wirklich nicht sicher, wie man es benutzt. Wie kann ich mit dieser Größe das QListWidget aufrufen, um diesen Wert zu erzwingen? (Oder ändere die Größe Tint?) Sorry, relativ neu zu Qt hier, und das ist sehr dunkel für mich. Danke für Ihre Hilfe! –

+0

Sie können 'sizeHint' auf diese Größe setzen und' sizeHintPolicy' auf 'Fixed' setzen; oder verwenden Sie die 'setGeometry()' Methode. Disclaimer: Ich habe nicht getestet, was ich hier vorschlage, aber ich bin ziemlich zuversichtlich, dass es funktionieren wird. – dpq

+4

Ich habe 'QListWidget' geerbt und' sizeHint() 'neu implementiert, um' contentsSize() 'zurückzugeben. Es klappt! Vielen Dank. – swongu

Verwandte Themen