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() 获取该行的高度,并在项目展开时递归地对子项目执行相同的操作。另外,您需要覆盖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, 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 项目

QTreeView

Qt窗口及控件-QTreeview/QTableView排序问题

Qt入门系列开发教程高级控件篇QTreeView树形视图

UITextView 根据内容动态改变高度?