Resize column width to fit into the QTableWidget pyqt

前端 未结 3 467
一整个雨季
一整个雨季 2020-12-09 10:51

I\'ve googled around but I\'m not able to find a solution to my problem.

I have a QTableWidget with 2 columns and what I\'m trying to do is to make them visible to t

相关标签:
3条回答
  • 2020-12-09 10:56

    This has a very easy solution in PyQt5. All you need to do is set the size adjust policy on the table when initialising the UI, and it will automatically resize to fit the contents. This can either be done via Qt Designer (in the QAbstractScrollArea section of the Property Editor), or programmatically, like this:

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

    You then just need to do:

        self.statTable.resizeColumnsToContents()
    

    whenever the table is re-populated.

    For PyQt4, everything has to be calculated manually, and a few hacks are also required to get completely consistent results. The demo script below works okay for me, but 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 讨论(0)
  • 2020-12-09 10:58

    For the autoadjust settings on the table widget in Qt Designer, you canlook in the object inspector for the table widget you can drill down to it as shown below.

    0 讨论(0)
  • 2020-12-09 11:14

    (PyQt5)

    The issue for me is that my cells in the right-most column are multi-line (QPlainTextEdit), and I wanted word-wrapping... but I also wanted this right-most column to extend to fill the parent container.

    It seems you can do everything you need in PyQt5 designer, in the Property editor for your QTableView:

    • in the "QTableView" section check "wordWrap"
    • in the "QAbstractScroll" section check "AdjustToContents" (as mentioned by Crap Phone)
    • in the "Header" section check "horizontalHeaderStretchLastSection"

    This then generates the following sort of code:

    self.history_table_view.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContentsOnFirstShow)
    self.history_table_view.horizontalHeader().setStretchLastSection(True )
    

    "word wrap = True" appears to be the default setting, so nothing is shown, but it would be this:

    self.history_table_view.setWordWrap(True)
    
    0 讨论(0)
提交回复
热议问题