2016-06-29 95 views
5

Sto sviluppando un'applicazione per computer con PySide e sto utilizzando QTableWidget. Diciamo che la mia tabella ha 3 colonne, ma i dati che contengono sono molto diversi, come (per ogni riga) una lunga frase nella prima colonna, quindi i numeri a 3 cifre nelle ultime due colonne. Mi piacerebbe che lo ridimensioni la tabella per adeguare la sua dimensione ai dati, o almeno per potere impostare le dimensioni delle colonne come (ad esempio) il 70/15/15% dello spazio disponibile.PySide - PyQt: come impostare la larghezza della colonna QTableWidget come proporzione dello spazio disponibile?

Qual è il modo migliore per farlo?

Ho provato table.horizontalHeader().setResizeMode(QHeaderView.Stretch) dopo aver letto this question ma rende 3 colonne della stessa dimensione.

Ho anche provato table.horizontalHeader().setResizeMode(QHeaderView.ResizeToContents) grazie a Fabio 's comment ma non riempie tutto lo spazio disponibile in base alle esigenze.

Interactive, Fixed, Stretch, ResizeToContents dal QHeaderView documentation sembrano darmi quello che mi serve (vedi seconda modifica).

Qualsiasi aiuto sarebbe apprezzato, anche se è per Qt/C++! Grazie mille.


EDIT: ho trovato una specie di soluzione ma non è ancora quello che sto cercando:

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

Sarebbe meglio se esistesse un metodo setStretchFirstSection, ma purtroppo non lo fa non sembra essere uno.


EDIT 2:

L'unica cosa che può essere modificato nella tabella è l'ultima colonna, l'utente può inserire un numero in esso. Le frecce rosse indicano cosa mi piacerebbe avere.

Ecco cosa succede con StretchStretch

Ecco cosa succede con ResizeToContentsResizeToContents

+0

Prova QHeaderView.ResizeToContents anziché QHeaderView.Stretch – Fabio

+0

Questo funziona, ma non è proprio quello che sto cercando, perché con 'ResizeToContents', poiché le mie colonne non sono abbastanza grandi, non riempiono lo spazio disponibile. Modificherò in modo che diventi più chiaro. – BusyAnt

risposta

10

Questo può essere risolto impostando la modalità di ridimensionamento per ogni colonna. La prima sezione deve tendere a prendere lo spazio disponibile, mentre le ultime due sezioni solo ridimensionare il loro contenuto:

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

Non sapevo che avrei potuto scegliere un diverso 'QHeaderView' per ogni colonna. Funziona bene, anche se ho cambiato in 'Fisso' per le ultime due colonne e poi ho aggiunto una larghezza minima con' self.table.setColumnWidth (index, width) '(si adatta meglio al mio caso) – BusyAnt

+2

In qt5 questa funzione è cambiata in setSectionResizeMode() –

2

Si può fare questo con QItemDelegates o QStyledItemDelegates. Se si desidera ridimensionare il contenuto a e con allungamento automatico, sarà necessario scegliere quale colonna è la colonna "stretch".

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() 

È possibile impostare la modalità di ridimensionamento per ResizeToContents, o se si desidera che l'utente sia in grado di regolare la larghezza della colonna, se necessario, basta chiamare resizeColumnsToContents manualmente dopo aver apportato modifiche alle voci della tabella.

Potrebbe anche essere necessario attenuare i calcoli della larghezza un po 'a causa dei margini e del riempimento tra le colonne (come aggiungere un pixel o due allo calculated_width per ciascuna colonna per tenere conto del bordo della cella).

+0

Questo è buono perché ora le mie colonne non vengono ridimensionate in qualsiasi momento come prima, ma non prendono ancora tutto lo spazio disponibile e la modifica della colonna "stretch" non sembra avere alcun effetto ... Sono fare qualcosa di sbagliato? Modificherò la mia domanda con i risultati che ottengo – 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)