QTreeView根据内容动态高度,显示三角形
Posted
技术标签:
【中文标题】QTreeView根据内容动态高度,显示三角形【英文标题】:QTreeView dynamic height according to content, disclosure triangle 【发布时间】:2020-12-30 21:38:20 【问题描述】:我想用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_())
问题是我希望小部件高度自动调整大小,无论它是折叠还是展开,例如这里:
有人知道怎么做吗?非常感谢,如果我能提供帮助,请告诉我!
【问题讨论】:
【参考方案1】:您必须根据其内容更新小部件的最大高度。对于每个顶部项目,您需要使用 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, 0, 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()
【讨论】:
以上是关于QTreeView根据内容动态高度,显示三角形的主要内容,如果未能解决你的问题,请参考以下文章
改变QTreeView项高的方法(改变Delegate行高,或者::data取数据的时候,根据Qt::SizeHintRole进行判断)
Qt - QPushButtons 代替 QTreeView 项目