调整列宽以适应 QTableWidget pyqt

Posted

技术标签:

【中文标题】调整列宽以适应 QTableWidget pyqt【英文标题】:Resize column width to fit into the QTableWidget pyqt 【发布时间】:2017-04-21 02:47:56 【问题描述】:

我用谷歌搜索过,但找不到解决问题的方法。

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

有图就清楚了:

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

所以,首先我将 th2 2 列的大小调整为内容:

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

它可以工作,但是小部件没有调整到 2 列的宽度。

【问题讨论】:

您是否尝试过我在回答中给出的解决方案?我很想知道他们是否解决了您的问题(解决起来非常棘手,而且我不确定我是否涵盖了所有极端情况)。 嗨,很抱歉没有回复了。顺便说一句,我通过在上面两行之后添加这一行来解决:self.statTable.setFixedWidth(self.statTable.columnWidth(0) + self.statTable.columnWidth(1)) 【参考方案1】:

这在 PyQt5 中有一个非常简单的解决方案。您只需在初始化 UI 时将set the size adjust policy 放在桌子上,它就会自动调整大小以适应内容。这可以通过 Qt 设计器(在属性编辑器的 QAbstractScrollArea 部分)或以编程方式完成,如下所示:

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

然后你只需要这样做:

    self.statTable.resizeColumnsToContents()

每当重新填充表格时。

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

【讨论】:

我正在使用 pyQt5 那么我在哪里可以找到 QT 设计器?因为我在任何地方都看不到它并且输入代码不起作用! @ekhumoro @MohammedAminAIMEUR。它在属性编辑器中(QAbstractScrollArea 部分)。 你应该pip install pyqt5-tools Qt 设计师在这个包里面。 @user6534005 我唯一的问题是它不能垂直放置。 >statTable.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents) - 有没有办法只调整水平滚动条(不能同时调整两者)?【参考方案2】:

对于 Qt Designer 中表格小部件的自动调整设置,您可以在对象检查器中查看表格小部件,您可以向下钻取它,如下所示。

【讨论】:

【参考方案3】:

(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 )

"word wrap = True" 似乎是默认设置,所以没有显示任何内容,但应该是这样的:

self.history_table_view.setWordWrap(True)

【讨论】:

【参考方案4】:

在调用 your_tablewidget.setItem() 后,每次都使用 your_tablewidget.resizeColumnsToContents()。您不需要任何其他设置。

【讨论】:

以上是关于调整列宽以适应 QTableWidget pyqt的主要内容,如果未能解决你的问题,请参考以下文章

qt中QTableWidget怎么根据内容自动调整列宽行高?

Tableview 列自动调整

C# iTextSharp 自动调整列宽

QTableWidget 和 PyQt4 中的列宽

PYQT5 QTableWidget详细用法

谷歌图表 API:设置表格列宽以适合数据