web-dev-qa-db-fra.com

Redimensionner la largeur de la colonne pour s’adapter au pyqt de QTableWidget

J'ai cherché sur Google, mais je ne parviens pas à trouver une solution à mon problème.

J'ai un QTableWidget avec 2 colonnes et ce que j'essaie de faire est de les rendre visibles à tout le widget sans afficher la barre de défilement horizontale.

Avec une image, tout devrait être clair:

 enter image description here

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

Donc, d’abord, j'ai redimensionné ces 2 colonnes au contenu avec:

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

et cela fonctionne, mais alors le widget ne redimensionne pas à la largeur de 2 colonnes.

4
matteo

Cela a une solution très facile dans PyQt5. Tout ce que vous avez à faire est de définir la stratégie d’ajustement de la taille sur la table lors de l’initialisation de l’UI, qui sera automatiquement redimensionnée pour s’adapter au contenu. Cela peut être fait soit dans Qt Designer, soit par programme, comme ceci:

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

Il vous suffit alors de faire:

    self.statTable.resizeColumnsToContents()

chaque fois que la table est re-peuplée.

Pour PyQt4, tout doit être calculé manuellement, et quelques hacks sont également nécessaires pour obtenir des résultats parfaitement 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 __== '__main__':

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