问题描述
我想用QTreeWidget
模拟一个disclosure triangle / disclosure widget。为此,我创建了一个仅包含一个顶级项目的QTreeWidget
。它的背景是透明的,标题是不可见的。
这是代码(mwe):
import sys
from pyside2.QtWidgets import ( QApplication,QLabel,QTreeWidget,QTreeWidgetItem,QVBoxLayout,QWidget)
class disclosureTree(QTreeWidget):
def __init__(self):
super().__init__()
# Add content
self.setColumnCount(1)
parent_item = QTreeWidgetItem(self,['disclosure triangle'])
self.addTopLevelItem(parent_item)
parent_item.addChild(QTreeWidgetItem(parent_item,'AAA'))
parent_item.addChild(QTreeWidgetItem(parent_item,'BBB'))
parent_item.addChild(QTreeWidgetItem(parent_item,'CCC'))
# Cosmetics
self.header().hide()
self.setStyleSheet('background-color: transparent;')
if __name__ == '__main__':
app = QApplication()
vBox = QVBoxLayout()
disclosuretree = disclosureTree()
label = QLabel('Plenty of space above…')
vBox.addWidget(disclosuretree)
vBox.addWidget(label)
vBox.addStretch()
widget = QWidget()
widget.setLayout(vBox)
widget.show()
sys.exit(app.exec_())
问题是我希望窗口小部件的高度自动调整大小,无论它是折叠还是展开,例如:
有人知道该怎么做吗?非常感谢,让我知道我是否可以帮忙!
解决方法
您必须根据其内容更新窗口小部件的最大高度。对于每个顶部项目,您需要使用rowHeight()
获取该行的高度,并在展开该项目时递归地对子项目执行相同的操作。另外,您需要覆盖sizeHint
和minimumSizeHint
。
class DisclosureTree(QTreeWidget):
def __init__(self):
# ...
self.expanded.connect(self.updateHeight)
self.collapsed.connect(self.updateHeight)
def updateHeight(self):
self.setMaximumHeight(self.sizeHint().height())
def getHeight(self,parent=None):
height = 0
if not parent:
parent = self.rootIndex()
for row in range(self.model().rowCount(parent)):
child = self.model().index(row,parent)
height += self.rowHeight(child)
if self.isExpanded(child) and self.model().hasChildren(child):
height += self.getHeight(child)
return height
def sizeHint(self):
hint = super().sizeHint()
hint.setHeight(self.getHeight() + self.frameWidth() * 2)
return hint
def minimumSizeHint(self):
return self.sizeHint()