我想添加在 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