Python中PyQt的树控件TreeWidget如何获取当前选中的Item列表?

比较人性的想法是,每个 Item 带一个唯一的 ID ( int 或 str ),可以自己设置,到时候遍历一遍把所有选中的 Item 的 ID 加入到 List 中,按照需要处理。但是 Qt Designer 里属性什么的好像没有类似的属性可以填,Qt Designer 生成的代码里好像只有 Item 对于 Parent 的 Index,这就不好弄了。。 这个功能好像也挺常用的啊。。

https://img.alicdn.com/imgextra/i3/3024818780/TB2SjWybMZjyKJjy0FhXXcdlFXa_!!3024818780.png
Python中PyQt的树控件TreeWidget如何获取当前选中的Item列表?


1 回复

在PyQt的QTreeWidget里,获取选中项列表直接用selectedItems()方法就行。这个方法返回一个列表,里面是当前所有被选中的QTreeWidgetItem对象。

给你个简单的例子,一看就明白:

import sys
from PyQt5.QtWidgets import QApplication, QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget, QPushButton

class TreeWidgetDemo(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        layout = QVBoxLayout()
        
        # 创建树控件
        self.tree = QTreeWidget()
        self.tree.setHeaderLabels(['名称', '类型'])
        
        # 添加一些示例数据
        root = QTreeWidgetItem(self.tree, ['根节点', '文件夹'])
        child1 = QTreeWidgetItem(root, ['子节点1', '文件'])
        child2 = QTreeWidgetItem(root, ['子节点2', '文件'])
        child3 = QTreeWidgetItem(child1, ['孙子节点', '文件'])
        
        self.tree.expandAll()
        
        # 创建按钮来获取选中项
        btn = QPushButton('获取选中项')
        btn.clicked.connect(self.get_selected_items)
        
        layout.addWidget(self.tree)
        layout.addWidget(btn)
        self.setLayout(layout)
        self.setWindowTitle('TreeWidget选中项示例')
        self.setGeometry(300, 300, 400, 300)

    def get_selected_items(self):
        # 关键代码:获取所有选中项
        selected_items = self.tree.selectedItems()
        
        if not selected_items:
            print("没有选中任何项")
            return
            
        print(f"选中了 {len(selected_items)} 个项:")
        for item in selected_items:
            # 获取每列文本
            name = item.text(0)
            item_type = item.text(1)
            print(f"  - {name} ({item_type})")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = TreeWidgetDemo()
    demo.show()
    sys.exit(app.exec_())

运行这个程序,在树控件里用Ctrl+点击多选几个节点,然后点按钮,控制台就会输出所有选中项的信息。

几点说明:

  1. selectedItems() 返回的是个Python列表,可以直接用len()、循环遍历等操作
  2. 每个选中项都是QTreeWidgetItem对象,用text(column)方法获取对应列的文本
  3. 支持单选和多选,取决于selectionMode的设置(默认是QAbstractItemView.ExtendedSelection,支持Ctrl多选)

总结:用tree.selectedItems()直接搞定。

回到顶部