2011-08-25 6 views

Respuesta

4

Por lo que sé, no hay una manera fácil de hacerlo. Debe sumar el ancho de las columnas de la tabla y luego agregar espacio para los encabezados. También debe agregar espacio para la barra de desplazamiento vertical y el marco del widget. Esta es una manera de hacerlo,

class myTableWidget(QtGui.QTableWidget): 

    def sizeHint(self): 
     width = 0 
     for i in range(self.columnCount()): 
      width += self.columnWidth(i) 

     width += self.verticalHeader().sizeHint().width() 

     width += self.verticalScrollBar().sizeHint().width() 
     width += self.frameWidth()*2 

     return QtCore.QSize(width,self.height()) 
6

Usted podría utilizar algo por el estilo (comenté lo suficientemente espero):

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class MyTableWidget(QTableWidget): 
    def __init__(self, x, y, parent = None): 
     super(MyTableWidget, self).__init__(x, y, parent) 

     self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) 
     self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) 

     # To force the width to use sizeHint().width() 
     self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Preferred) 

     # To readjust the size automatically... 
     # ... when columns are added or resized 
     self.horizontalHeader().geometriesChanged \ 
      .connect(self.updateGeometryAsync) 
     self.horizontalHeader().sectionResized \ 
      .connect(self.updateGeometryAsync)   
     # ... when a row header label changes and makes the 
     # width of the vertical header change too 
     self.model().headerDataChanged.connect(self.updateGeometryAsync) 

    def updateGeometryAsync(self):  
     QTimer.singleShot(0, self.updateGeometry) 

    def sizeHint(self): 
     height = QTableWidget.sizeHint(self).height() 

     # length() includes the width of all its sections 
     width = self.horizontalHeader().length() 

     # you add the actual size of the vertical header and scrollbar 
     # (not the sizeHint which would only be the preferred size)     
     width += self.verticalHeader().width()   
     width += self.verticalScrollBar().width()  

     # and the margins which include the frameWidth and the extra 
     # margins that would be set via a stylesheet or something else 
     margins = self.contentsMargins() 
     width += margins.left() + margins.right() 

     return QSize(width, height) 

Cuando un encabezado de fila cambios, el ancho de la totalidad de los cambios de cabecera verticales, pero no inmediatamente después de que se emita la señal headerDataChanged.
Es por eso que usé un QTimer para llamar al updateGeometry (que debe llamarse cuando cambia sizeHint) después de que QTableWidget haya actualizado el ancho del encabezado vertical.

+0

Esto funcionó bien para mí, mientras que la respuesta 'aceptada' no. Una razón puede ser que estoy usando un QTableView que no tiene el método columnCount utilizado en la solución de Mr Terry. Tenga en cuenta que con QTableView necesita configurar el modelo desde el principio en el constructor para que esta solución funcione, ya que utiliza el modelo para indicar si los encabezados cambian. –

+0

Palabra de advertencia: estaba usando esta implementación de 'MyTableWidget' en un diálogo no guardado (por ejemplo, se creó el cuadro de diálogo y salió del alcance en el mismo método), y me dio un' RuntimeError: wrap C/C++ object del tipo MyTableWidget ha sido eliminado' error. Creo que el 'QTimer' estaba tratando de llamar' self.updateGeometry' después de que el widget ya había sido recogido basura (¿es posible?). En cualquier caso, acabo de reemplazar las llamadas a 'self.updateGeometryAsync' con llamadas a la acción' self.updateGeometry' y todavía funcionó bien para mí. – jeremiahbuddha

Cuestiones relacionadas