Spaltenbreite in Tabelle festlegen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Nobuddy
User
Beiträge: 833
Registriert: Montag 30. Januar 2012, 16:38

Montag 10. Dezember 2018, 14:43

Hallo zusammen,

bin Anfänger bei pyqt und beschäftige mich seit ein paar Tagen damit.
Ich möchte eine Tabelle mit Inhalt befüllen, eine feste Column-Breite pro Column vorgeben und eine flexible Zeilenhöhe.
Hier habe ich mal den Code, mit dem ich mich beschäftige:

Code: Alles auswählen

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

        self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
        self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)

        # To force the width to use sizeHint().width()
        self.setSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.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):
        QtCore.QTimer.singleShot(0, self.updateGeometry)

    def sizeHint(self):
        height = QtGui.QTableWidget.sizeHint(self).height()
        height += self.horizontalScrollBar().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 QtCore.QSize(width, height)

if __name__ == "__main__":
    import sys

    LABEL = ['Position', 'Lieferant', 'Artikelnummer', 'Benennung', 'Hersteller', 'Herstellermummer', 'VE', 'Inhalt']
    _LIST_ = [
        ['001', 'Meyer', '47110', 'Bratwurst weiss, 125 g / Stück, 50% Schweinefleisch, 50% Rindfleisch', 'Müller', '0012347110', 'Pack', '100'],
        ['002', 'Meyer', '47120', 'Bratwurst weiss, 175 g / Stück, 50% Schweinefleisch, 50% Rindfleisch', 'Müller', '0012347120', 'Pack', '100'],
        ['003', 'Meyer', '47121', 'Bratwurst weiss, 175 g / Stück, 50% Schweinefleisch, 50% Rindfleisch, Palettenware 100000 Stück, verpackt zu 100 Stück / Pack, vakuumverpackt', 'Müller', '0012347121', 'Palette', '100000'],
        ]
    width2columns = [10, 15, 20, 40, 15, 20, 10, 10]

    app = QtGui.QApplication(sys.argv)  
    #app.setApplicationName('MyWindow')
    view = MyTableWidget(0, 0)        # rows, columns
    view.setRowCount(len(_LIST_)) 
    view.setColumnCount(len(_LIST_[0])) 
    view.setHorizontalHeaderLabels(LABEL)

    header = view.horizontalHeader()
    for i, name in enumerate(LABEL):
        header.setResizeMode(QtGui.QHeaderView.ResizeToContents)
        header.setResizeMode(i, QtGui.QHeaderView.Stretch)
        #header.setResizeMode(i, width2columns[i])

    for y, row in enumerate(_LIST_): 
        for x, col in enumerate(row):
            item = QtGui.QTableWidgetItem(col) 
            view.setItem(y, x, item)
    view.show()
    sys.exit(app.exec_())
Bei der Festlegung der einzelnen Column-Breite, habe ich schon gegoogelt und manches ausprobiert, leider aber ohne den gewünschten Erfolg.

Vielleicht könnt Ihr mir dabei helfen, aufzuzeigen was grundsätzlich falsch ist und mich in die richtige Richtung bringen.

Grüße Nobuddy
Antworten