调整列宽以适应 QTableWidget pyqt

新手上路,请多包涵

我四处搜索,但无法找到解决问题的方法。

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

一张图应该就很清楚了:

在此处输入图像描述

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

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

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

它可以工作,但是小部件不会调整到 2 列宽度。

原文由 matteo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
1 个回答

这在 PyQt5 中有一个非常简单的解决方案。您需要做的就是在初始化 UI 时在表格上 设置大小调整策略,它会自动调整大小以适应内容。这可以通过 Qt Designer(在属性编辑器的 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_())

原文由 ekhumoro 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏