2010-07-04 15 views
7

Sto lavorando con il componente QTableWidget in PyQt4 e non riesco a ottenere colonne correttamente dimensionate, in base alle rispettive lunghezze di intestazione.Imposta la larghezza minima della colonna alla larghezza dell'intestazione in PyQt4 QTableWidget

Ecco ciò che il layout della tabella dovrebbe essere simile (sans tubi, ovviamente):

Index | Long_Header | Longer_Header 
1  | 102402  | 100 
2  | 123123  | 2 
3  | 454689  | 18 

Il codice con cui sto lavorando sembra qualcosa di simile:

import sys 
from PyQt4.QtCore import QStringList, QString 
from PyQt4.QtGui import QApplication, QMainWindow, QSizePolicy 
from PyQt4.QtGui import QTableWidget, QTableWidgetItem 

def createTable(): 
    table = QTableWidget(5, 3) 
    table.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) 

    headers = QStringList() 
    headers.append(QString("Index")) 
    headers.append(QString("Long_Header")) 
    headers.append(QString("Longer_Header")) 

    table.setHorizontalHeaderLabels(headers) 
    table.horizontalHeader().setStretchLastSection(True) 

    # ignore crappy names -- this is just an example :) 
    cell1 = QTableWidgetItem(QString("1")) 
    cell2 = QTableWidgetItem(QString("102402")) 
    cell3 = QTableWidgetItem(QString("100")) 

    cell4 = QTableWidgetItem(QString("2")) 
    cell5 = QTableWidgetItem(QString("123123")) 
    cell6 = QTableWidgetItem(QString("2")) 

    cell7 = QTableWidgetItem(QString("3")) 
    cell8 = QTableWidgetItem(QString("454689")) 
    cell9 = QTableWidgetItem(QString("18")) 

    table.setItem(0, 0, cell1) 
    table.setItem(0, 1, cell2) 
    table.setItem(0, 2, cell3) 
    table.setItem(1, 0, cell4) 
    table.setItem(1, 1, cell5) 
    table.setItem(1, 2, cell6) 
    table.setItem(2, 0, cell7) 
    table.setItem(2, 1, cell8) 
    table.setItem(2, 2, cell9) 

    return table 

if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    mainW = QMainWindow() 

    mainW.setMinimumWidth(300) 
    mainW.setCentralWidget(createTable()) 

    mainW.show() 

    app.exec_() 

Quando l'applicazione viene eseguita, la prima colonna è piuttosto ampia mentre le altre colonne sono un po 'compresse.

C'è un modo per forzare la tabella in base alle larghezze dell'intestazione anziché ai dati stessi? Meglio ancora, c'è un modo per forzare ogni larghezza di colonna ad essere la larghezza massima dei dati e dei valori di intestazione?

Aggiornamento: Ho provato a chiamare resizeColumnsToContents() sul tavolo, ma la vista diventa orribilmente straziati:

Python Table http://img514.imageshack.us/img514/8633/tablef.png

** ** Update2: resizeColumnsToContents() funziona bene fino a quando si chiama dopo tutte le celle e le intestazioni sono state inserite nella tabella.

risposta

8
table.resizeColumnsToContents() 

dovrebbe fare il trucco per questo specifico esempio.

Assicurarsi di contrassegnare lo PyQt documentation se non lo si è già fatto (utile quando si sta cercando una funzione specifica).

+0

Grazie per la risposta, ma ho già provato resizeColumnsToContents(). Ridimensiona le colonne ai dati e le intestazioni diventano illeggibili. Ho la documentazione presente (la uso costantemente), ma non riesco a trovare una soluzione a questo problema irritante. – bedwyr

+0

@bedwyr: Forse il problema si verifica altrove (proprietà in un file .ui (designer) ereditato da forse?). Non riesco a riprodurre il problema qui (PyQt 4.5.4 iirc, Mac). Questo è il codice di esempio (con un semplice 'table.resizeColumnsToContents()' aggiunto): http://img210.imageshack.us/img210/9968/screenshot20100704at225.png – ChristopheD

+0

Ho progettato tutto a mano (non usando Qt Designer), quindi è probabile che qualcosa stia sbagliando: ^) Sto usando 4.7.2 su Linux, quindi è possibile che ci sia qualcosa di diverso nella porta Linux; Ne dubito comunque. Il problema è molto probabilmente alla mia fine. Continuerò a scavare - grazie! – bedwyr

Problemi correlati