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

44
我正在使用PySide开发一款计算机应用程序,并且正在使用QTableWidget。假设我的表格有3列,但它们包含的数据非常不同,例如(对于每一行)第一列中有一个长句子,然后在最后两列中有三位数的数字。我想要调整表格大小以适应数据,或者至少能够将列大小设置为可用空间的70/15/15%
什么是最好的方法?
我尝试了在阅读this question之后使用table.horizontalHeader().setResizeMode(QHeaderView.Stretch),但它使得3个列的大小相同。
我也尝试了table.horizontalHeader().setResizeMode(QHeaderView.ResizeToContents),感谢Fabio评论,但它不能像需要的那样填充所有可用空间。
QHeaderView文档中,InteractiveFixedStretchResizeToContents都无法给我所需的结果(见第二次编辑)。
任何帮助都将不胜感激,即使是关于Qt/C++的!非常感谢。

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

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

如果存在一个setStretchFirstSection方法,那将会更好,但不幸的是似乎没有这样的方法。


编辑2:

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

StretchStretch时会发生以下情况:

ResizeToContents ResizeToContents时会发生以下情况:


尝试使用QHeaderView.ResizeToContents而不是QHeaderView.Stretch。 - Fabio
这个可以用,但不完全符合我的要求,因为使用 ResizeToContents 时,如果我的列不够大,它们就无法填满可用空间。我会进行编辑以使其更加清晰明了。 - AdrienW
对于您的第二次编辑,我认为正确的方法是设置列的默认宽度,根据您的粗略估计,然后由于可以拉伸,用户可以随后根据自己的需求进行修改。 - frankliuao
11个回答

0
我找不到一个“开箱即用”的解决方案,但我做了以下操作:
创建一个线程,每50毫秒检查表格的大小是否已更改,如果更改,则触发一个信号传递给一个插槽,该插槽根据当前表格大小更新列宽度。
在下面的示例中,列宽度的比例为1:1:2。
示例:
import time
from PySide6.QtCore import Signal

# Class definition here

def __init__(self):
    # Class initialization here
    self.signal_table_size_changed = Signal()
    self.signal_table_size_changed.connect(self.adjust_table_column_width)
    self.table_width = None
    threading.Thread(target=self.table_size_watcher).start()


def adjust_table_column_width(self):
    self.table_width = self.table.size().width()
    self.table.setColumnWidth(0, 0.25 * self.table_width)
    self.table.setColumnWidth(1, 0.25 * self.table_width)
    self.table.setColumnWidth(2, 0.50 * self.table_width)

def table_size_watcher(self):
    while True:
        if self.table_width != self.table.size().width():
            self.signal_table_size_changed.emit()
        time.sleep(0.05)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接