我一直在尝试获取2个QTableView小部件以在PyQt5中相互调整大小。这些小部件位于QComboBox中,并且布局设置为grid。我尝试了resizeColumnToContents方法,但这只是使QTableView的列的宽度变小。
当前情况:
应该如何:
QTableView 1可以具有多个列,也可以只有一个。我希望QTableView 2在布局上进行扩展,以便覆盖整个空间,而QTableView 1只是要显示的一列。有没有办法做到这一点?我尝试使用分离器并动态更改setstretchfactor,但无法实现它。一些线索或提示?
您可能要使用:希瑟= table.horizontalHeader对于表中的每个列(列):header.setSectionResizemode(ncol,QHeadedrView.resizeToContents)#这将限制列的宽度。如果您想让一列填充所有可用空间,请使用“ QHeaderView.Stretch”此外,您可以使用QHBoxlayout并可能关联两个表的宽度。
有两种可能的解决方案。
如果要使用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中的表:
此外,您需要将second表的水平拉伸设置为1,或者将layoutStretch(或网格布局的layoutColumnStretch)属性设置为0, 1
。这将确保第二个表将获得最大可用空间,同时保持第一个表的最小大小足以显示其内容(基于sizeHint)。
此方法也可以与QSplitter一起使用,但是请记住,从手动调整拆分器的大小开始,它将始终尝试根据新位置保持比例大小。