调整列宽以适应QTableWidget pyqt

时间:2016-12-06 12:47:25

标签: python qt pyqt qtablewidget autoresize

我已经搜索过,但我无法找到解决问题的方法。

我有一个包含2列的QTableWidget,我尝试做的是让它们对整个小部件可见,而不会出现水平滚动条。

有了图片,应该很清楚:

enter image description here

我使用Qt Designer创建UI和一些代码来填充所有小部件和其他内容。

所以,首先我将th2 2列重新调整为内容:

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

并且它可以工作,但是Widget没有调整为2列宽度。

3 个答案:

答案 0 :(得分:13)

这在PyQt5中有一个非常简单的解决方案。初始化UI时,您需要做的只是set the size adjust policy,它会自动调整大小以适应内容。这可以在Qt Designer中完成,也可以通过编程方式完成,如下所示:

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

然后您只需要这样做:

    self.statTable.resizeColumnsToContents()

无论何时重新填充表格。

对于PyQt4,一切都必须手动计算,并且还需要一些黑客来获得完全一致的结果。下面的演示脚本对我来说没问题,但是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_())

答案 1 :(得分:2)

对于Qt Designer中表格窗口小部件的自动调整设置,您可以在对象检查器中查找表格窗口小部件,如下所示。

enter image description here

答案 2 :(得分:0)

(PyQt5)

对我来说,问题是我最右边一列中的单元格是多行(QPlainTextEdit),我想自动换行...但是我也想将此最右边一列扩展到填充父容器。

似乎您可以在PyQt5设计器中完成QTableView的属性编辑器中所需的一切:

  • 在“ QTableView”部分中,选中“ wordWrap”
  • 在“ QAbstractScroll”部分中,选中“ AdjustToContents”(如Crap Phone所述)
  • 在“标题”部分中,选中“ horizo​​ntalHeaderStretchLastSection”

然后生成以下类型的代码:

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

“自动换行= True”似乎是默认设置,因此没有显示任何内容,只是这样:

self.history_table_view.setWordWrap(True)