根据数据更改QTableView小部件的水平大小

问题描述 投票:0回答:2

我一直在尝试获取2个QTableView小部件以在PyQt5中相互调整大小。这些小部件位于QComboBox中,并且布局设置为grid。我尝试了resizeColumnToContents方法,但这只是使QTableView的列的宽度变小。

当前情况:

how it is

应该如何:

how it should be

QTableView 1可以具有多个列,也可以只有一个。我希望QTableView 2在布局上进行扩展,以便覆盖整个空间,而QTableView 1只是要显示的一列。有没有办法做到这一点?我尝试使用分离器并动态更改setstretchfactor,但无法实现它。一些线索或提示?

python-3.x pyqt5 qtableview
2个回答
0
投票

您可能要使用:希瑟= table.horizo​​ntalHeader对于表中的每个列(列):header.setSectionResizemode(ncol,QHeadedrView.resizeToContents)#这将限制列的宽度。如果您想让一列填充所有可用空间,请使用“ QHeaderView.Stretch”此外,您可以使用QHBoxlayout并可能关联两个表的宽度。


0
投票

有两种可能的解决方案。

如果要使用QSplitter,允许用户调整列的大小,则可以在调整窗口大小之后调整内容的大小。由于表和拆分器可能需要一些时间来调整其大小,因此必须在稍有延迟(“事件循环”周期)之后进行。

class Test(QtWidgets.QMainWindow):
    # ...
    def delaySplitterResize(self):
        if not self.model1.columnCount():
            return
        total = self.table1.width() + self.table2.width()
        leftWidth = self.table1.frameWidth() * 2 + self.table1.contentsMargins().left() * 2
        for s in range(self.model1.columnCount()):
            leftWidth += self.table1.horizontalHeader().sectionSize(s)
        self.splitter.setSizes([leftWidth, total - leftWidth])

    def resizeEvent(self, event):
        super().resizeEvent(event)
        QtCore.QTimer.singleShot(0, self.delaySplitterResize)

另一种可能性是在模型内容每次更改时对表进行子类化并更新其sizeHint:

class MinimumSizeTable(QtWidgets.QTableView):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setMinimumWidth(self.horizontalHeader().defaultSectionSize())

    def setModel(self, model):
        if self.model():
            self.model().columnsInserted.disconnect(self.updateGeometry)
            self.model().columnsRemoved.disconnect(self.updateGeometry)
        super().setModel(model)
        if self.model():
            self.model().columnsInserted.connect(self.updateGeometry)
            self.model().columnsRemoved.connect(self.updateGeometry)
        self.updateGeometry()

    def sizeHint(self):
        hint = super().sizeHint()
        if not self.model() or not self.model().columnCount():
            hint.setWidth(self.horizontalHeader().defaultSectionSize())
        else:
            width = self.frameWidth() * 2 + self.contentsMargins().left() * 2
            for s in range(self.model().columnCount()):
                width += self.horizontalHeader().sectionSize(s)
            hint.setWidth(width)
        return hint

要在您的UI中使用此类,您需要promote Designer中的表:

  • 右键单击表并选择“升级为”
  • 在“升级的类名称”字段中输入子类名称
  • 在“标题文件”字段中键入包含子类的Python文件,但不包含扩展名(例如“ mytable”)
  • 单击“添加”,然后单击“升级”,然后保存。

此外,您需要将second表的水平拉伸设置为1,或者将layoutStretch(或网格布局的layoutColumnStretch)属性设置为0, 1。这将确保第二个表将获得最大可用空间,同时保持第一个表的最小大小足以显示其内容(基于sizeHint)。

此方法也可以与QSplitter一起使用,但是请记住,从手动调整拆分器的大小开始,它将始终尝试根据新位置保持比例大小。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.