2016-12-06 2 views
2

J'ai parcouru les pages mais je ne suis pas en mesure de trouver une solution à mon problème.Redimensionner la largeur de la colonne pour l'adapter à QTableWidget pyqt

J'ai un QTableWidget avec 2 colonnes et ce que j'essaye de faire est de les rendre visibles à l'ensemble du widget sans que la barre de défilement horizontale n'apparaisse.

Avec une image, il devrait être tout clair:

enter image description here

J'ai utilisé Qt Designer pour créer l'interface utilisateur et un code pour remplir tous les widgets et d'autres choses.

Alors, d'abord je redimensionnées Th2 2 colonnes au contenu avec:

self.statTable.resizeColumnToContents(0) 
self.statTable.resizeColumnToContents(1) 

et il fonctionne, mais le widget est pas le redimensionnement aux 2 largeur des colonnes.

+0

Avez-vous déjà essayé la solution (s) que j'ai donné dans ma réponse? Je serais intéressé de savoir s'ils ont résolu votre problème (c'était assez difficile à faire, et je ne suis pas sûr que j'ai couvert tous les cas de coin). – ekhumoro

+0

Salut, désolé de ne plus répondre .. En fait, j'ai résolu en ajoutant cette ligne après les deux lignes ci-dessus: '' self.statTable.setFixedWidth (self.statTable.columnWidth (0) + self.statTable.columnWidth (1)) '' – matteo

Répondre

6

Cela a une solution très facile dans PyQt5. Tout ce que vous devez faire est set the size adjust policy sur la table lors de l'initialisation de l'interface utilisateur, et il sera automatiquement redimensionner pour s'adapter au contenu. Cela peut être fait dans Qt Designer, ou par programme, comme celui-ci:

self.statTable.setSizeAdjustPolicy(
     QtWidgets.QAbstractScrollArea.AdjustToContents) 

Vous suffit alors de faire:

self.statTable.resizeColumnsToContents() 

chaque fois que la table est repeuplée.

Pour PyQt4, tout doit être calculé manuellement, et quelques hacks sont également nécessaires pour obtenir des résultats complètement cohérents. Le script de démonstration ci-dessous fonctionne bien pour moi, mais YMMV:

import random 
from PyQt4 import QtCore, QtGui 

class Window(QtGui.QWidget): 
    def __init__(self): 
     super(Window, self).__init__() 
     self.table = QtGui.QTableWidget(5, 2, self) 
     self.button = QtGui.QPushButton('Populate', self) 
     self.button.clicked.connect(self.populate) 
     layout = QtGui.QGridLayout(self) 
     layout.addWidget(self.table, 0, 0) 
     layout.addWidget(self.button, 1, 0) 
     layout.setColumnStretch(1, 1) 

    def populate(self): 
     words = 'Red Green Blue Yellow Black White Purple'.split() 
     length = random.randint(2, len(words)) 
     self.table.setRowCount(random.randint(3, 30)) 
     for column in range(self.table.columnCount()): 
      for row in range(self.table.rowCount()): 
       item = QtGui.QTableWidgetItem(' '.join(
        random.sample(words, random.randint(1, length)))) 
       self.table.setItem(row, column, item) 

     self.table.setVisible(False) 
     self.table.verticalScrollBar().setValue(0) 
     self.table.resizeColumnsToContents() 
     self.table.setVisible(True) 
     self.setTableWidth() 

    def setTableWidth(self): 
     width = self.table.verticalHeader().width() 
     width += self.table.horizontalHeader().length() 
     if self.table.verticalScrollBar().isVisible(): 
      width += self.table.verticalScrollBar().width() 
     width += self.table.frameWidth() * 2 
     self.table.setFixedWidth(width) 

    def resizeEvent(self, event): 
     self.setTableWidth() 
     super(Window, self).resizeEvent(event) 

if __name__ == '__main__': 

    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.setGeometry(700, 150, 800, 400) 
    window.show() 
    sys.exit(app.exec_()) 
+0

J'utilise pyQt5 alors où puis-je trouver cela sur le concepteur QT? parce que je ne le vois nulle part et en tapant le code n'a pas fonctionné! @ekhumoro –

+2

@MohammedAminAIMEUR. C'est dans l'éditeur de propriétés (section 'QAbstractScrollArea'). – ekhumoro