PySide - PyQt:如何将QTableWidget列宽设置为可用空间的比例?

时间:2016-06-29 11:53:39

标签: python qt user-interface pyqt pyside

我正在使用 PySide 开发计算机应用程序,而且我正在使用QTableWidget。让我们说我的表有3列,但它们包含的数据非常不同,比如(对于每一行)第一列中的长句,然后是最后两列中的3位数。我希望让我的表调整大小以便将其大小调整为数据,或者至少能够将列大小设置为(例如)70/15 / 15%的可用空间

这样做的最佳方式是什么?

我在阅读this question之后尝试过table.horizontalHeader().setResizeMode(QHeaderView.Stretch),但它会生成相同大小的3列。

由于Fabio comment,我还尝试了table.horizontalHeader().setResizeMode(QHeaderView.ResizeToContents),但它并未根据需要填写所有可用空间。

来自QHeaderView documentationInteractiveFixedStretchResizeToContents似乎都无法满足我的需求(参见第二次编辑)。

任何帮助都会受到赞赏,即使是 Qt / C ++ !非常感谢你。

编辑:我找到了一种解决方法,但它仍然不是我想要的:

header = table.horizontalHeader()
header.setResizeMode(QHeaderView.ResizeToContents)
header.setStretchLastSection(True)

如果存在setStretchFirstSection方法会更好,但不幸的是似乎没有。

编辑2:

表中唯一可以修改的是最后一列,用户可以在其中输入数字。红色箭头表示我想要的东西。

以下Stretch Stretch

会发生什么

以下ResizeToContents ResizeToContents

会发生什么

6 个答案:

答案 0 :(得分:23)

这可以通过为每列设置调整大小模式来解决。第一部分必须拉伸以占用可用空间,而最后两部分只是调整其内容:

PyQt4的:

header = self.table.horizontalHeader()
header.setResizeMode(0, QtGui.QHeaderView.Stretch)
header.setResizeMode(1, QtGui.QHeaderView.ResizeToContents)
header.setResizeMode(2, QtGui.QHeaderView.ResizeToContents)

PyQt5:

header = self.table.horizontalHeader()       
header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch)
header.setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeToContents)
header.setSectionResizeMode(2, QtWidgets.QHeaderView.ResizeToContents)

答案 1 :(得分:5)

PyQt4的

header = self.table.horizontalHeader()
header.setResizeMode(0, QtGui.QHeaderView.Stretch)
header.setResizeMode(1, QtGui.QHeaderView.ResizeToContents)
header.setResizeMode(2, QtGui.QHeaderView.ResizeToContents)
header.setResizeMode(3, QtGui.QHeaderView.Stretch)

PyQt5

header = self.table.horizontalHeader()       
header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch)
header.setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeToContents)
header.setSectionResizeMode(2, QtWidgets.QHeaderView.ResizeToContents)
header.setSectionResizeMode(3, QtWidgets.QHeaderView.Stretch)

答案 2 :(得分:2)

您可以使用QItemDelegatesQStyledItemDelegates执行此操作。如果要调整内容进行自动拉伸,则需要选择哪个列为“拉伸”列。

class ResizeDelegate(QStyledItemDelegate):

    def __init__(self, table, stretch_column, *args, **kwargs):
        super(ResizeDelegate, self).__init__(*args, **kwargs)        
        self.table = table
        self.stretch_column = stretch_column

    def sizeHint(self, option, index):
        size = super(ResizeDelegate, self).sizeHint(option, index)
        if index.column() == self.stretch_column:
            total_width = self.table.viewport().size().width()
            calc_width = size.width()
            for i in range(self.table.columnCount()):
                if i != index.column():
                    option_ = QtGui.QStyleOptionViewItem()
                    index_ = self.table.model().index(index.row(), i)
                    self.initStyleOption(option_, index_)
                    size_ = self.sizeHint(option_, index_)
                    calc_width += size_.width()
            if calc_width < total_width:
                size.setWidth(size.width() + total_width - calc_width)
        return size

...

table = QTableWidget()
delegate = ResizeDelegate(table, 0)
table.setItemDelegate(delegate)
... # Add items to table
table.resizeColumnsToContents()

您可以将调整大小模式设置为ResizeToContents,或者如果您希望用户能够根据需要调整列宽,只需在更改表项后手动调用resizeColumnsToContents。 / p>

由于列之间的边距和填充,您可能还需要稍微调整宽度计算(例如,为每个列添加一个或两个像素以考虑单元格边框)。

答案 3 :(得分:2)

如前所述,您可以通过设置每列的调整大小模式来做到这一点。但是,如果您有很多列,那么这可能是很多代码。我的方式是将“常规”调整大小模式设置为“ ResizeToContent”,然后将一(或多个)列设置为“拉伸”!

代码如下:

PyQt4:

header = self.table.horizontalHeader()
header.setResizeMode(QtGui.QHeaderView.ResizeToContents)
header.setResizeMode(0, QtGui.QHeaderView.Stretch)

PyQt5:

header = self.table.horizontalHeader()
header.setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents)       
header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch)

答案 4 :(得分:2)

我使用了它,setMinumumsectionsize解决了我的Qtableview单元格大小问题

self.questionWidget.tableView.setModel(self.model)
self.questionWidget.tableView.verticalHeader().setVisible(False)
self.questionWidget.tableView.horizontalHeader().setMinimumSectionSize(200)

答案 5 :(得分:0)

我必须删除 QtWidget 才能让我的工作正常工作。

        header = self.tag_table.horizontalHeader()
        header.setSectionResizeMode(QHeaderView.ResizeToContents)