2010-07-04 6 views
7

Je travaille avec le composant QTableWidget dans PyQt4 et je n'arrive pas à obtenir des colonnes de taille correcte, en fonction de leurs longueurs d'en-tête respectives.Définir la largeur de colonne minimale à la largeur de l'en-tête dans PyQt4 QTableWidget

Voici ce que la mise en page de table devrait ressembler (tuyaux de sans, évidemment):

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

Le code Je travaille avec ressemble à quelque chose comme ceci:

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

Lorsque l'application exécute, la première colonne est assez large tandis que les autres colonnes sont un peu compressées.

Existe-t-il un moyen de forcer la taille de la table en fonction des largeurs d'en-tête plutôt que des données elles-mêmes? Mieux encore, existe-t-il un moyen de forcer chaque largeur de colonne à être la largeur maximale des données et des valeurs d'en-tête?

Mise à jour: Je l'ai essayé d'appeler resizeColumnsToContents() sur la table, mais la vue devient horriblement mutilée:

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

** Update2 **: resizeColumnsToContents() fonctionne très bien aussi longtemps qu'il appelle après, toutes les cellules et tous les en-têtes ont été insérés dans la table.

Répondre

8
table.resizeColumnsToContents() 

devrait faire l'affaire pour cet exemple spécifique.

Assurez-vous de marquer le PyQt documentation si vous ne l'avez pas déjà fait (pratique lorsque vous recherchez une fonction spécifique).

+0

Merci pour la réponse, mais j'ai déjà essayé resizeColumnsToContents(). Il redimensionne les colonnes aux données et les en-têtes deviennent illisibles. J'ai la documentation présente (je l'utilise constamment), mais je n'arrive pas à trouver une solution à ce problème épineux. – bedwyr

+0

@bedwyr: Peut-être que le problème est déclenché ailleurs (propriétés dans un fichier .ui (designer) dont vous héritez peut-être?). Je ne peux pas reproduire le problème ici (PyQt 4.5.4 iirc, Mac). C'est ce que votre exemple de code (avec un simple 'table.resizeColumnsToContents()' ajouté) ressemble à: http://img210.imageshack.us/img210/9968/screenshot20100704at225.png – ChristopheD

+0

J'ai tout conçu à la main (sans utiliser Qt Designer), donc c'est probablement quelque chose que je fais mal: ^) J'utilise 4.7.2 sous Linux, donc il est possible que quelque chose soit différent dans le port Linux; J'en doute cependant. Le problème est le plus probable de ma part. Je vais continuer à creuser - merci! – bedwyr

Questions connexes