我正在使用 PySide 开发计算机应用程序,而且我正在使用QTableWidget。让我们说我的表有3列,但它们包含的数据非常不同,比如(对于每一行)第一列中的长句,然后是最后两列中的3位数。我希望让我的表调整大小以便将其大小调整为数据,或者至少能够将列大小设置为(例如)70/15 / 15%的可用空间。
这样做的最佳方式是什么?
我在阅读this question之后尝试过table.horizontalHeader().setResizeMode(QHeaderView.Stretch)
,但它会生成相同大小的3列。
由于Fabio comment,我还尝试了table.horizontalHeader().setResizeMode(QHeaderView.ResizeToContents)
,但它并未根据需要填写所有可用空间。
来自QHeaderView documentation的Interactive
,Fixed
,Stretch
,ResizeToContents
似乎都无法满足我的需求(参见第二次编辑)。
任何帮助都会受到赞赏,即使是 Qt / C ++ !非常感谢你。
编辑:我找到了一种解决方法,但它仍然不是我想要的:
header = table.horizontalHeader()
header.setResizeMode(QHeaderView.ResizeToContents)
header.setStretchLastSection(True)
如果存在setStretchFirstSection
方法会更好,但不幸的是似乎没有。
编辑2:
表中唯一可以修改的是最后一列,用户可以在其中输入数字。红色箭头表示我想要的东西。
会发生什么 会发生什么答案 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)
您可以使用QItemDelegates
或QStyledItemDelegates
执行此操作。如果要调整内容并进行自动拉伸,则需要选择哪个列为“拉伸”列。
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)