python - QTreeView根据内容动态高度,显示三角形
问题描述
我想用. QTreeWidget
为此,我创建了一个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
and 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()
推荐阅读
- android - Hide ImageView 隐藏多张图片
- jvm - 用invokespecial调用公共方法?
- javascript - Angular 2+ 属性组件 - 子元素被抑制
- javascript - 承诺不会异步运行
- sql - 使用 SQL Pivot 合并两个表的数据并连接子查询
- java - 当我使用增量运算符时,为什么会打印以下内容?
- html - 如何将输入定位在它自己的div的左下角
- ansible - 用ansible发送mailconfig命令,回答问题
- javascript - 在 Ace 编辑器中嵌入语法
- c# - 如何解决 OrchardCore cms 中的启用功能问题?