2010-07-04 10 views
7

estoy trabajando con el componente QTableWidget en PyQt4 y me parece que no puede llegar a las columnas de tamaño correctamente, de acuerdo con sus respectivas longitudes de cabecera.Establecer ancho mínimo de la columna Anchura del cabezal en PyQt4 QTableWidget

Aquí es lo que el diseño de la mesa debe ser similar (sans tuberías, obviamente):

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

El código que estoy trabajando con un aspecto algo como esto:

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

Cuando se ejecuta la aplicación, la primera columna es bastante ancha, mientras que las otras columnas están algo comprimidas.

¿Hay una manera de forzar a la mesa a medida según las anchuras de cabecera, en lugar de los datos en sí? Mejor aún, ¿hay alguna manera de forzar el ancho de cada columna para que sea el ancho máximo de los datos y los valores del encabezado?

actualización: He intentado llamar resizeColumnsToContents() sobre la mesa, pero la vista se convierte en horriblemente mutilado:

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

** ** Actualización 2: resizeColumnsToContents() funciona muy bien, siempre y cuando se llama después de todas las celdas y los encabezados se han insertado en la tabla.

Respuesta

8
table.resizeColumnsToContents() 

debe hacer el truco para este ejemplo específico.

asegúrese de marcar la PyQt documentation si no lo ha hecho (muy útil cuando usted está buscando para una función específica).

+0

Gracias por la respuesta, pero yo ya probé resizeColumnsToContents(). Cambia el tamaño de las columnas a los datos, y los encabezados se vuelven ilegibles. Tengo la documentación presente (la uso constantemente), pero parece que no puedo encontrar una solución a este problema. – bedwyr

+0

@bedwyr: ¿Tal vez el problema se desencadena en otro lugar (propiedades en un archivo .ui (diseñador) del que heredaste quizás?). No puedo reproducir el problema aquí (PyQt 4.5.4 iirc, Mac). Esto es lo que se ve el código de ejemplo (con un simple table.resizeColumnsToContents '()' añadido) como: http://img210.imageshack.us/img210/9968/screenshot20100704at225.png – ChristopheD

+0

He diseñado todo a mano (sin utilizar Qt Designer), entonces es probable que algo esté haciendo mal: ^) Estoy usando 4.7.2 en Linux, entonces es posible que algo sea diferente en el puerto Linux; Aunque lo dudo. El problema es más probable de mi parte. Seguiré cavando, ¡gracias! – bedwyr

Cuestiones relacionadas