2017-12-13 6 views
1

Ich habe eine QTableWidget mit einer letzten Spalte, die Text variabler Länge enthält.QHeaderView: Stretch oder ResizeToContents basierend auf Spalten Inhalt Größe

Ich möchte entweder den letzten Abschnitt des QHeaderView auf den Inhalt basierend auf der Größe des Abschnitts strecken oder die Größe ändern. Wenn die Inhaltsgröße den verbleibenden Platz im Widget nicht überschreitet, möchte ich es dehnen (um einen hässlichen, ungefüllten Bereich im Widget zu verhindern). Ich kann dies erreichen, indem ich setStretchLastSection(True) verwende. Wenn die Inhaltsgröße jedoch die gestreckte Spalte überschreitet, werden die letzten Teile meines Inhalts abgeschnitten, da die Größe der Spalte nicht geändert wird. QHeaderView stellt den ResizeMode ResizeToContents für diesen Fall bereit, jedoch bleibt das Widget bei kurzen Inhalten leer.

Ich dachte über manuelle Größenanpassung der Spalte. Leider kann ich nicht direkt auf die Inhaltsgröße zugreifen, da sectionSizeFromContents() geschützt ist. Ich denke, ich könnte QHeaderView ableiten und neu implementieren, aber ich frage mich, ob es eine bessere Lösung gibt.

+0

Geschützte Methoden zugänglich in pyqt sind, Wenn Sie nicht Python verwenden, entfernen Sie bitte die pyqt Tags von deiner Frage. – ekhumoro

+0

Ich benutze pyqt5. Beim Aufruf von 'sectionSizeFromContents()' bekomme ich folgende Ausnahme: 'RuntimeError: kein Zugriff auf geschützte Funktionen oder Signale für Objekte, die nicht aus Python stammen. – tsabsch

+1

Ja, erstellen Sie einfach eine Instanz von 'QHeaderView' und setzen Sie sie auf den Tisch. Sie müssen keine Unterklasse erstellen. – ekhumoro

Antwort

1

Ich habe die Funktionalität von QHeaderView::sectionSizeFromContents() missverstanden. Ich nahm an, dass es die Abschnittsgröße der Zellen zurückgibt, die zu dem Abschnitt gehören, aber diese Information kann natürlich nicht in dem Header gespeichert werden. Stattdessen gibt es die Größe des Header-Inhalts zurück, d. H. Das gegebene Label.

Es ist jedoch möglich, die Inhaltsgröße einer Spalte durch QTableWidget::sizeHintForColumn() zu erhalten. Meine Tabelle hat nur zwei Spalten, so den verbleibenden Platz für die zweite Spalte zu berechnen, die ich verwenden kann:

stretched_size = table.viewport().size().width() - table.horizontalHeader().sectionSize(0) 

, die die Spaltengröße gleich in den ResizeMode::Stretch. Deshalb kann ich mein Problem lösen, indem die Querschnittsgröße auf das Maximum der gestreckten Höchstgröße und die Größenhinweis Kolumne:

size = max(table.sizeHintForColumn(1), stretched_size) 
table.horizontalHeader().resizeSection(1, size) 
Verwandte Themen