QTreeView根据内容的动态高度,显示三角形

问题描述

我想用QTreeWidget模拟一个disclosure triangle / disclosure widget。为此,我创建了一个仅包含一个顶级项目的QTreeWidget。它的背景是透明的,标题是不可见的。

Collapsed

Expanded

这是代码(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_())

问题是我希望窗口小部件的高度自动调整大小,无论它是折叠还是展开,例如:

enter image description here

有人知道该怎么做吗?非常感谢,让我知道我是否可以帮忙!

解决方法

您必须根据其内容更新窗口小部件的最大高度。对于每个顶部项目,您需要使用rowHeight()获取该行的高度,并在展开该项目时递归地对子项目执行相同的操作。另外,您需要覆盖sizeHintminimumSizeHint

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()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...