it-swarm.com.de

Passen Sie die Spaltenbreite an das QTableWidget-Pyqt an

Ich habe herumgegoogelt, aber ich bin nicht in der Lage, eine Lösung für mein Problem zu finden.

Ich habe ein QTableWidget mit 2 Spalten und ich versuche, sie für das gesamte Widget sichtbar zu machen, ohne dass die horizontale Bildlaufleiste angezeigt wird.

Mit einem Bild sollte alles klar sein:

 enter image description here

Ich habe Qt Designer verwendet, um die Benutzeroberfläche und einen Code zu erstellen, um alle Widgets und andere Dinge zu füllen.

Also habe ich zuerst die Größe der 2 Spalten auf den Inhalt angepasst mit:

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

und es funktioniert, aber dann wird die Größe des Widgets nicht auf die Breite von 2 Spalten geändert.

4
matteo

Dies hat eine sehr einfache Lösung in PyQt5. Alles, was Sie tun müssen, ist beim Initialisieren der Benutzeroberfläche die Richtlinie zur Größenanpassung in der Tabelle festzulegen. Die Größe wird dann automatisch an den Inhalt angepasst. Dies kann entweder in Qt Designer oder programmgesteuert wie folgt erfolgen:

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

Sie müssen dann nur noch Folgendes tun:

    self.statTable.resizeColumnsToContents()

wenn die Tabelle neu gefüllt wird.

Für PyQt4 muss alles manuell berechnet werden, und es sind auch einige Hacks erforderlich, um vollständig konsistente Ergebnisse zu erzielen. Das Demo-Skript unten funktioniert in Ordnung für mich, aber 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