QTreeWidget / QTreeView 自定义折叠到“始终显示”叶子

问题描述 投票:0回答:0

我想添加在 QTreeWidget 或 QTreeView 中保持任意数量的叶子可见的能力,即使父级折叠。这将使用户能够仅保留他们感兴趣的信息,同时隐藏其他信息。

我怎样才能实现这个效果?

import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QTreeWidget, QTreeWidgetItem

data = {
    "Module 1": {
        "Sub-Module 1": {
            "Leaf 1": "Leaf 1 Info",
            "Leaf 2": "Leaf 2 Info",
            "Leaf 3": "Leaf 3 Info",
            "Leaf 4": "Leaf 4 Info",
        },
        "Sub-Module 2": {
            "Leaf 5": "Leaf 5 Info",
            "Leaf 6": "Leaf 6 Info",
            "Leaf 7": "Leaf 7 Info",
            "Leaf 8": "Leaf 8 Info",
        },
    },
    "Module 2": {
        "Sub-Module 3": {
            "Leaf 9": "Leaf 9 Info",
            "Leaf 10": "Leaf 10 Info",
            "Leaf 11": "Leaf 11 Info",
            "Leaf 12": "Leaf 12 Info",
        },
    },
}


class TreeWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setGeometry(300, 300, 300, 400)
        tw = QTreeWidget(self)
        tw.setColumnCount(2)
        tw.setAlternatingRowColors(True)
        tw.setHeaderLabels(["Name", "Description"])
        self.fill_tree(tw, data)
        self.setCentralWidget(tw)
        tw.expandAll()
        tw.resizeColumnToContents(0)

    def fill_tree(self, widg, data) -> None:
        for key, val in data.items():
            if isinstance(val, str):
                tw_item = QTreeWidgetItem([key, val])
                keep_going = False
            else:
                tw_item = QTreeWidgetItem([key])
                keep_going = True

            if isinstance(widg, QTreeWidget):
                widg.addTopLevelItem(tw_item)
            else:
                widg.addChild(tw_item)

            if keep_going:
                self.fill_tree(tw_item, val)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = TreeWindow()
    window.show()
    sys.exit(app.exec())

举例来说,如果运行上面的代码并且选择“Leaf 3”为“always showed”但树的其余部分被折叠,则以下是希望显示的信息。

|-- Module 1
|   `-- Sub-Module 1
|       `-- Leaf 3
`-- Module 2
python qt pyside pyside6
© www.soinside.com 2019 - 2024. All rights reserved.