2016-06-29 13 views
5

Ich entwickle eine Computeranwendung mit PySide und ich verwende das QTableWidget. Nehmen wir an, meine Tabelle hat 3 Spalten, aber die Daten, die sie enthalten, sind sehr unterschiedlich, wie (für jede Zeile) ein langer Satz in der ersten Spalte, dann dreistellige Zahlen in den zwei letzten Spalten. Ich möchte haben meine Tabelle Größe ändern, um seine Größe an die Daten anzupassen, oder zumindest in der Lage die Spaltengrößen als (sagen wir) 70/15/15% des verfügbaren Speicherplatzes.PySide - PyQt: Wie setze ich QTableWidget Spaltenbreite als Anteil des verfügbaren Platzes?

Was ist der beste Weg, dies zu tun?

Ich habe versucht, table.horizontalHeader().setResizeMode(QHeaderView.Stretch) nach dem Lesen this question, aber es macht 3 Spalten der gleichen Größe.

Ich habe auch versucht table.horizontalHeader().setResizeMode(QHeaderView.ResizeToContents) dank Fabio 's comment, aber es füllt nicht den gesamten verfügbaren Platz nach Bedarf.

Weder Interactive, Fixed, Stretch, ResizeToContents vom QHeaderView documentation scheint mir zu geben, was ich brauche (zweite bearbeiten sehen).

Jede Hilfe wäre willkommen, auch wenn es für Qt/C++ ist! Vielen Dank.


EDIT: fand ich irgendwie dieses Problem zu umgehen, aber es ist immer noch nicht, was ich suche:

header = table.horizontalHeader() 
header.setResizeMode(QHeaderView.ResizeToContents) 
header.setStretchLastSection(True) 

Es wäre besser, wenn es eine setStretchFirstSection Methode existiert, aber leider gibt tut scheint nicht eins zu sein.


EDIT 2:

Das einzige, was in der Tabelle geändert werden kann, ist die letzte Spalte, kann der Benutzer eine Anzahl darin eingeben. Rote Pfeile zeigen an, was ich gerne hätte.

Hier ist, was mit Stretch geschieht Stretch

Hier ist, was mit ResizeToContentsResizeToContents

+0

Versuchen QHeaderView.ResizeToContents anstelle von QHeaderView.Stretch – Fabio

+0

Dies funktioniert, aber es ist nicht ganz das, was ich suche, denn mit 'ResizeToContents', da meine Spalten nicht groß genug sind, füllen sie nicht den verfügbaren Platz. Ich werde bearbeiten, damit es klarer wird. – BusyAnt

Antwort

10

Dies kann gelöst werden, indem der Größenänderungsmodus für jede Spalte festgelegt wird. Der erste Abschnitt muss strecken, um den verfügbaren Platz zu nehmen, während die letzten beiden Abschnitte nur auf dessen Inhalt skalieren:

PyQt4:

header = self.table.horizontalHeader() 
header.setResizeMode(0, QtGui.QHeaderView.Stretch) 
header.setResizeMode(1, QtGui.QHeaderView.ResizeToContents) 
header.setResizeMode(2, QtGui.QHeaderView.ResizeToContents) 

PyQt5:

header = self.table.horizontalHeader()  
header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch) 
header.setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeToContents) 
header.setSectionResizeMode(2, QtWidgets.QHeaderView.ResizeToContents) 
+0

Ich wusste nicht, dass ich für jede Spalte eine andere 'QHeaderView' wählen könnte. Das funktioniert gut, obwohl ich für die letzten zwei Spalten auf 'Fixed' gewechselt habe und dann eine minimale Breite mit 'self.table.setColumnWidth (index, width)' hinzugefügt habe (passt besser zu meinem Fall) – BusyAnt

+2

In qt5 wird diese Funktion in setSectionResizeMode geändert() –

2

geschieht du mit QItemDelegates oder QStyledItemDelegates tun können. Wenn Sie die Größe des Inhalts ändern möchten, müssen und automatische Dehnung haben, müssen Sie wählen, welche Spalte die Spalte "Dehnung" ist.

class ResizeDelegate(QStyledItemDelegate): 

    def __init__(self, table, stretch_column, *args, **kwargs): 
     super(ResizeDelegate, self).__init__(*args, **kwargs)   
     self.table = table 
     self.stretch_column = stretch_column 

    def sizeHint(self, option, index): 
     size = super(ResizeDelegate, self).sizeHint(option, index) 
     if index.column() == self.stretch_column: 
      total_width = self.table.viewport().size().width() 
      calc_width = size.width() 
      for i in range(self.table.columnCount()): 
       if i != index.column(): 
        option_ = QtGui.QStyleOptionViewItem() 
        index_ = self.table.model().index(index.row(), i) 
        self.initStyleOption(option_, index_) 
        size_ = self.sizeHint(option_, index_) 
        calc_width += size_.width() 
      if calc_width < total_width: 
       size.setWidth(size.width() + total_width - calc_width) 
     return size 

... 

table = QTableWidget() 
delegate = ResizeDelegate(table, 0) 
table.setItemDelegate(delegate) 
... # Add items to table 
table.resizeColumnsToContents() 

Sie können die Resize-Modus auf ResizeToContents gesetzt, oder wenn Sie die Benutzer wollen die Spaltenbreite nach Bedarf in der Lage anzupassen, rufen Sie einfach resizeColumnsToContents manuell nach Änderungen an den Tabellenelemente zu machen.

Sie müssen möglicherweise auch etwas mit den Breitenberechnungen herumfummeln, wegen der Ränder und Abstände zwischen den Spalten (fügen Sie für jede Spalte einen oder zwei Pixel zu calculated_width hinzu, um den Zellrahmen zu berücksichtigen).

+0

Das ist gut, denn meine Spalten werden nicht mehr wie früher skaliert, aber sie nehmen immer noch nicht den gesamten verfügbaren Platz, und das Ändern der "Stretch" -Spalte scheint keinen Effekt zu haben ... Bin ich etwas falsch machen? Ich werde meine Frage mit den Ergebnissen bearbeiten, die ich bekomme – BusyAnt

2

PyQt4

header = self.table.horizontalHeader() 
header.setResizeMode(0, QtGui.QHeaderView.Stretch) 
header.setResizeMode(1, QtGui.QHeaderView.ResizeToContents) 
header.setResizeMode(2, QtGui.QHeaderView.ResizeToContents) 
header.setResizeMode(3, QtGui.QHeaderView.Stretch) 

PyQt5

header = self.table.horizontalHeader()  
header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch) 
header.setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeToContents) 
header.setSectionResizeMode(2, QtWidgets.QHeaderView.ResizeToContents) 
header.setSectionResizeMode(3, QtWidgets.QHeaderView.Stretch)