首页 > 解决方案 > 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_())

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

在此处输入图像描述

有人知道该怎么做吗?非常感谢,如果我能提供帮助,请告诉我!

标签: pythonpyside2qtreeviewqtreewidget

解决方案


您必须根据其内容更新小部件的最大高度。对于每个顶部项目,您需要使用获取该行的高度,rowHeight()并在项目展开时递归地对子项目执行相同的操作。此外,您需要覆盖sizeHintand 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()

推荐阅读