PyQt6/PySide6中QTreeView类的实现

Written by

in

文章目录
  • 树形视图:用于显示分层数据的控件。 模型-视图架构:QTreeView 使用模型-视图架构,其中 QTreeView 是视图部分,负责显示数据;而模型(如 QStandardItemModel)则负责管理数据。 节点:树形结构中的基本单位,每个节点可以有子节点。 根节点:树形结构的最顶层节点。 展开/折叠:控制节点的显示状态,展开时显示其子节点,折叠时隐藏其子节点。 选择模式:控制用户如何选择节点。 编辑模式:允许用户直接在树形视图中编辑数据。
  • 要使用 QTreeView,首先需要导入相应的库: from PyQt6.QtWidgets import QApplication, QTreeView, QVBoxLayout, QWidget, QPushButton from PyQt6.QtGui import QStandardItemModel, QStandardItem # 或者 from PySide6.QtWidgets import QApplication, QTreeView, QVBoxLayout, QWidget, QPushButton from PySide6.QtGui import QStandardItemModel, QStandardItem 接着创建一个窗口,并在其中添加 QTreeView 控件: class MyWindow(QWidget): def __init__(self): super().__init__() self.setWindowTitle(“我的应用程序”) self.setGeometry(100, 100, 800, 600) # 初始化UI self.initUI() def initUI(self): layout = QVBoxLayout() # 创建树形视图 self.tree_view = QTreeView(self) # 创建模型 self.model = QStandardItemModel() self.model.setHorizontalHeaderLabels([‘名称’, ‘类型’]) # 添加数据 root_item = self.model.invisibleRootItem() item1 = QStandardItem(‘项目1’) item1.appendRow([QStandardItem(‘子项目1.1’), QStandardItem(‘类型A’)]) item1.appendRow([QStandardItem(‘子项目1.2’), QStandardItem(‘类型B’)]) root_item.appendRow(item1) item2 = QStandardItem(‘项目2’) item2.appendRow([QStandardItem(‘子项目2.1’), QStandardItem(‘类型C’)]) item2.appendRow([QStandardItem(‘子项目2.2’), QStandardItem(‘类型D’)]) root_item.appendRow(item2) # 设置模型到视图 self.tree_view.setModel(self.model) # 添加按钮 button = QPushButton(“打印选中项”, self) button.clicked.connect(self.print_selection) # 添加到布局 layout.addWidget(self.tree_view) layout.addWidget(button) self.setLayout(layout) def print_selection(self): selected_indices = self.tree_view.selectedIndexes() for index in selected_indices: row = index.row() column = index.column() value = index.data() print(f”行: {row}, 列: {column}, 值: {value}”) if __name__ == “__main__”: app = QApplication([]) window = MyWindow() window.show() app.exec()
  • QTreeView 支持多种信号,这些信号可以在用户交互时发射。常见的信号包括 clicked、doubleClicked、pressed、activated 和 selectionChanged。你可以通过连接这些信号到槽函数来处理用户的输入事件。 def on_clicked(index): row = index.row() column = index.column() value = index.data() print(f”点击: 行: {row}, 列: {column}, 值: {value}”) def on_double_clicked(index): row = index.row() column = index.column() value = index.data() print(f”双击: 行: {row}, 列: {column}, 值: {value}”) def on_pressed(index): row = index.row() column = index.column() value = index.data() print(f”按下: 行: {row}, 列: {column}, 值: {value}”) def on_activated(index): row = index.row() column = index.column() value = index.data() print(f”激活: 行: {row}, 列: {column}, 值: {value}”) def on_selection_changed(selected, deselected): print(“选择发生变化”) tree_view.clicked.connect(on_clicked) tree_view.doubleClicked.connect(on_double_clicked) tree_view.pressed.connect(on_pressed) tree_view.activated.connect(on_activated) tree_view.selectionModel().selectionChanged.connect(on_selection_changed)
  • 除了使用内置的样式设置外,你还可以通过样式表(QSS)来自定义 QTreeView 的外观。样式表类似于CSS,提供了强大的样式控制能力。 tree_view.setStyleSheet(“”” QTreeView { background-color: #f0f0f0; alternate-background-color: #e0e0e0; selection-background-color: #0078d7; selection-color: white; gridline-color: #cccccc; border: 1px solid #cccccc; } QTreeView::item { padding: 5px; } QTreeView::item:selected { background-color: #0078d7; color: white; } QTreeView::item:hover { background-color: #d0d0d0; } QTreeView::item:focus { outline: none; } QHeaderView::section { background-color: #e0e0e0; border: 1px solid #cccccc; padding: 5px; } QHeaderView::section:checked { background-color: #0078d7; color: white; } “””)
  • 你可以动态地更新 QTreeView 的内容,或者根据某些条件控制其行为。例如,在定时器或其他事件触发时更新树形视图的数据。 import time from PyQt6.QtCore import QTimer class MyWindow(QWidget): def __init__(self): super().__init__() self.setWindowTitle(“我的应用程序”) self.setGeometry(100, 100, 800, 600) # 初始化UI self.initUI() # 创建定时器 self.timer = QTimer(self) self.timer.timeout.connect(self.update_tree_view) self.timer.start(5000) # 每5秒触发一次 def initUI(self): layout = QVBoxLayout() # 创建树形视图 self.tree_view = QTreeView(self) # 创建模型 self.model = QStandardItemModel() self.model.setHorizontalHeaderLabels([‘名称’, ‘类型’]) # 添加数据 root_item = self.model.invisibleRootItem() item1 = QStandardItem(‘项目1’) item1.appendRow([QStandardItem(‘子项目1.1’), QStandardItem(‘类型A’)]) item1.appendRow([QStandardItem(‘子项目1.2’), QStandardItem(‘类型B’)]) root_item.appendRow(item1) item2 = QStandardItem(‘项目2’) item2.appendRow([QStandardItem(‘子项目2.1’), QStandardItem(‘类型C’)]) item2.appendRow([QStandardItem(‘子项目2.2’), QStandardItem(‘类型D’)]) root_item.appendRow(item2) # 设置模型到视图 self.tree_view.setModel(self.model) # 添加到布局 layout.addWidget(self.tree_view) self.setLayout(layout) def update_tree_view(self): # 更新模型数据 self.model.clear() self.model.setHorizontalHeaderLabels([‘名称’, ‘类型’]) # 添加新的数据 root_item = self.model.invisibleRootItem() item1 = QStandardItem(‘项目1 (更新)’) item1.appendRow([QStandardItem(‘子项目1.1 (更新)’), QStandardItem(‘类型A’)]) item1.appendRow([QStandardItem(‘子项目1.2 (更新)’), QStandardItem(‘类型B’)]) root_item.appendRow(item1) item2 = QStandardItem(‘项目2 (更新)’) item2.appendRow([QStandardItem(‘子项目2.1 (更新)’), QStandardItem(‘类型C’)]) item2.appendRow([QStandardItem(‘子项目2.2 (更新)’), QStandardItem(‘类型D’)]) root_item.appendRow(item2) if __name__ == “__main__”: app = QApplication([]) window = MyWindow() window.show() app.exec()
  • QTreeView 是 PyQt6/PySide6 中非常强大且灵活的控件,适用于各种需要展示和编辑树形结构数据的场景。通过设置不同的属性和使用样式表,你可以创建出丰富多样的树形视图样式。同时,通过信号与槽机制,你可以方便地处理用户的输入事件。希望以上内容能帮助你更好地理解和运用 QTreeView,并能够根据具体需求创建出功能丰富且用户友好的树形视图控件。 到此这篇关于PyQt6/PySide6中QTreeView类的实现的文章就介绍到这了,更多相关PyQt6/PySide6 QTreeView类内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: Qt重写QTreeView自绘实现酷炫样式
  • 目录
    • 1. 基本概念
    • 2. 创建 QTreeView 实例
    • 3. QTreeView 的常用属性和方法
      • 属性
      • 方法
    • 4. 详细示例
      • 设置模型
      • 获取当前选中的索引
      • 展开和折叠节点
      • 选择行或列
      • 清除选择
      • 全选
      • 根据内容调整列宽和行高
      • 隐藏和显示列或行
      • 启用或禁用排序
      • 设置选择行为
      • 设置选择模式
      • 设置编辑触发器
      • 设置工具提示和状态栏提示
    • 5. 信号与槽机制
      • 6. 自定义样式
        • 7. 动态更新和控制
          • 总结

            QTreeView 是 PyQt6 或 PySide6 库中用于显示分层数据的控件。它适用于展示树形结构的数据,如文件系统、组织结构等。QTreeView 也是基于模型-视图架构的,通常与 QAbstractItemModel 的子类(如 QStandardItemModel 或自定义模型)一起使用。下面我将详细介绍 QTreeView 的主要特性及其使用方法。

            • 树形视图:用于显示分层数据的控件。
            • 模型-视图架构QTreeView 使用模型-视图架构,其中 QTreeView 是视图部分,负责显示数据;而模型(如 QStandardItemModel)则负责管理数据。
            • 节点:树形结构中的基本单位,每个节点可以有子节点。
            • 根节点:树形结构的最顶层节点。
            • 展开/折叠:控制节点的显示状态,展开时显示其子节点,折叠时隐藏其子节点。
            • 选择模式:控制用户如何选择节点。
            • 编辑模式:允许用户直接在树形视图中编辑数据。

            要使用 QTreeView,首先需要导入相应的库:

            from PyQt6.QtWidgets import QApplication, QTreeView, QVBoxLayout, QWidget, QPushButton
            from PyQt6.QtGui import QStandardItemModel, QStandardItem
            # 或者
            from PySide6.QtWidgets import QApplication, QTreeView, QVBoxLayout, QWidget, QPushButton
            from PySide6.QtGui import QStandardItemModel, QStandardItem
            

            接着创建一个窗口,并在其中添加 QTreeView 控件:

            class MyWindow(QWidget):
                def __init__(self):
                    super().__init__()
                    self.setWindowTitle("我的应用程序")
                    self.setGeometry(100, 100, 800, 600)
                  
                    # 初始化UI
                    self.initUI()
              
                def initUI(self):
                    layout = QVBoxLayout()
                  
                    # 创建树形视图
                    self.tree_view = QTreeView(self)
                  
                    # 创建模型
                    self.model = QStandardItemModel()
                    self.model.setHorizontalHeaderLabels(['名称', '类型'])
                  
                    # 添加数据
                    root_item = self.model.invisibleRootItem()
                    item1 = QStandardItem('项目1')
                    item1.appendRow([QStandardItem('子项目1.1'), QStandardItem('类型A')])
                    item1.appendRow([QStandardItem('子项目1.2'), QStandardItem('类型B')])
                    root_item.appendRow(item1)
                  
                    item2 = QStandardItem('项目2')
                    item2.appendRow([QStandardItem('子项目2.1'), QStandardItem('类型C')])
                    item2.appendRow([QStandardItem('子项目2.2'), QStandardItem('类型D')])
                    root_item.appendRow(item2)
                  
                    # 设置模型到视图
                    self.tree_view.setModel(self.model)
                  
                    # 添加按钮
                    button = QPushButton("打印选中项", self)
                    button.clicked.connect(self.print_selection)
                  
                    # 添加到布局
                    layout.addWidget(self.tree_view)
                    layout.addWidget(button)
                  
                    self.setLayout(layout)
              
                def print_selection(self):
                    selected_indices = self.tree_view.selectedIndexes()
                    for index in selected_indices:
                        row = index.row()
                        column = index.column()
                        value = index.data()
                        print(f"行: {row}, 列: {column}, 值: {value}")
            
            if __name__ == "__main__":
                app = QApplication([])
                window = MyWindow()
                window.show()
                app.exec()
            

            • model:获取或设置当前使用的模型。
            • selectionModel:获取或设置当前的选择模型。
            • currentIndex:获取或设置当前选中的索引。
            • header:获取表头。
            • rootIndex:获取或设置根索引。
            • alternatingRowColors:获取或设置是否交替行颜色。
            • showGrid:获取或设置是否显示网格线。
            • gridStyle:获取或设置网格线样式。
            • wordWrap:获取或设置是否启用自动换行。
            • resizeMode:获取或设置调整大小模式。
            • selectionBehavior:获取或设置选择行为(选择单元格、行或列)。
            • selectionMode:获取或设置选择模式(单选或多选)。
            • editTriggers:获取或设置编辑触发器。
            • toolTip:获取或设置工具提示文本。
            • statusTip:获取或设置状态栏提示文本。

            • setModel(QAbstractItemModel):设置当前使用的模型。
            • model() -> QAbstractItemModel:获取当前使用的模型。
            • setSelectionModel(QItemSelectionModel):设置当前的选择模型。
            • selectionModel() -> QItemSelectionModel:获取当前的选择模型。
            • setCurrentIndex(QModelIndex):设置当前选中的索引。
            • currentIndex() -> QModelIndex:获取当前选中的索引。
            • header() -> QHeaderView:获取表头。
            • setRootIndex(QModelIndex):设置根索引。
            • rootIndex() -> QModelIndex:获取根索引。
            • setAlternatingRowColors(bool):设置是否交替行颜色。
            • alternatingRowColors() -> bool:判断是否交替行颜色。
            • setShowGrid(bool):设置是否显示网格线。
            • showGrid() -> bool:判断是否显示网格线。
            • setGridStyle(Qt.PenStyle):设置网格线样式。
            • gridStyle() -> Qt.PenStyle:获取网格线样式。
            • setWordWrap(bool):设置是否启用自动换行。
            • wordWrap() -> bool:判断是否启用自动换行。
            • setResizeMode(QHeaderView.ResizeMode):设置调整大小模式。
            • resizeMode() -> QHeaderView.ResizeMode:获取调整大小模式。
            • setSelectionBehavior(QAbstractItemView.SelectionBehavior):设置选择行为。
            • selectionBehavior() -> QAbstractItemView.SelectionBehavior:获取选择行为。
            • setSelectionMode(QAbstractItemView.SelectionMode):设置选择模式。
            • selectionMode() -> QAbstractItemView.SelectionMode:获取选择模式。
            • setEditTriggers(QAbstractItemView.EditTrigger):设置编辑触发器。
            • editTriggers() -> QAbstractItemView.EditTrigger:获取编辑触发器。
            • setToolTip(str):设置工具提示文本。
            • toolTip() -> str:获取工具提示文本。
            • setStatusTip(str):设置状态栏提示文本。
            • statusTip() -> str:获取状态栏提示文本。
            • expand(QModelIndex):展开指定索引的节点。
            • collapse(QModelIndex):折叠指定索引的节点。
            • expandAll():展开所有节点。
            • collapseAll():折叠所有节点。
            • selectRow(int):选择指定行。
            • selectColumn(int):选择指定列。
            • clearSelection():清除选择。
            • selectAll():全选。
            • selectedIndexes() -> List[QModelIndex]:获取所有选中的索引。
            • resizeColumnToContents(int column):根据内容调整指定列宽。
            • resizeRowToContents(int row):根据内容调整指定行高。
            • hideColumn(int column):隐藏指定列。
            • showColumn(int column):显示指定列。
            • hideRow(int row):隐藏指定行。
            • showRow(int row):显示指定行。

            # 创建模型
            model = QStandardItemModel()
            model.setHorizontalHeaderLabels(['名称', '类型'])
            
            # 添加数据
            root_item = model.invisibleRootItem()
            item1 = QStandardItem('项目1')
            item1.appendRow([QStandardItem('子项目1.1'), QStandardItem('类型A')])
            item1.appendRow([QStandardItem('子项目1.2'), QStandardItem('类型B')])
            root_item.appendRow(item1)
            
            item2 = QStandardItem('项目2')
            item2.appendRow([QStandardItem('子项目2.1'), QStandardItem('类型C')])
            item2.appendRow([QStandardItem('子项目2.2'), QStandardItem('类型D')])
            root_item.appendRow(item2)
            
            # 设置模型到视图
            tree_view.setModel(model)
            

            def print_selection():
                selected_indices = tree_view.selectedIndexes()
                for index in selected_indices:
                    row = index.row()
                    column = index.column()
                    value = index.data()
                    print(f"行: {row}, 列: {column}, 值: {value}")
            

            # 展开指定索引的节点
            tree_view.expand(tree_view.model().index(0, 0))
            
            # 折叠指定索引的节点
            tree_view.collapse(tree_view.model().index(0, 0))
            
            # 展开所有节点
            tree_view.expandAll()
            
            # 折叠所有节点
            tree_view.collapseAll()
            

            # 选择第1行
            tree_view.selectRow(1)
            
            # 选择第2列
            tree_view.selectColumn(2)
            

            tree_view.clearSelection()
            

            tree_view.selectAll()
            

            # 根据内容调整第1列的宽度
            tree_view.resizeColumnToContents(1)
            
            # 根据内容调整第1行的高度
            tree_view.resizeRowToContents(1)
            

            # 隐藏第2列
            tree_view.hideColumn(2)
            
            # 显示第2列
            tree_view.showColumn(2)
            
            # 隐藏第3行
            tree_view.hideRow(3)
            
            # 显示第3行
            tree_view.showRow(3)
            

            tree_view.setSortingEnabled(True)  # 启用排序
            tree_view.setSortingEnabled(False)  # 禁用排序
            

            tree_view.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)  # 选择整行
            tree_view.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectColumns)  # 选择整列
            tree_view.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectItems)  # 选择单元格
            

            tree_view.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection)  # 单选
            tree_view.setSelectionMode(QAbstractItemView.SelectionMode.ContiguousSelection)  # 连续多选
            tree_view.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection)  # 扩展多选
            tree_view.setSelectionMode(QAbstractItemView.SelectionMode.MultiSelection)  # 多选
            

            tree_view.setEditTriggers(QAbstractItemView.EditTrigger.DoubleClicked | QAbstractItemView.EditTrigger.SelectedClicked)  # 双击或选中后点击编辑
            

            tree_view.setToolTip("这是一个树形视图")
            tree_view.setStatusTip("查看和编辑数据")
            

            QTreeView 支持多种信号,这些信号可以在用户交互时发射。常见的信号包括 clickeddoubleClickedpressedactivated 和 selectionChanged。你可以通过连接这些信号到槽函数来处理用户的输入事件。

            def on_clicked(index):
                row = index.row()
                column = index.column()
                value = index.data()
                print(f"点击: 行: {row}, 列: {column}, 值: {value}")
            
            def on_double_clicked(index):
                row = index.row()
                column = index.column()
                value = index.data()
                print(f"双击: 行: {row}, 列: {column}, 值: {value}")
            
            def on_pressed(index):
                row = index.row()
                column = index.column()
                value = index.data()
                print(f"按下: 行: {row}, 列: {column}, 值: {value}")
            
            def on_activated(index):
                row = index.row()
                column = index.column()
                value = index.data()
                print(f"激活: 行: {row}, 列: {column}, 值: {value}")
            
            def on_selection_changed(selected, deselected):
                print("选择发生变化")
            
            tree_view.clicked.connect(on_clicked)
            tree_view.doubleClicked.connect(on_double_clicked)
            tree_view.pressed.connect(on_pressed)
            tree_view.activated.connect(on_activated)
            tree_view.selectionModel().selectionChanged.connect(on_selection_changed)
            

            除了使用内置的样式设置外,你还可以通过样式表(QSS)来自定义 QTreeView 的外观。样式表类似于CSS,提供了强大的样式控制能力。

            tree_view.setStyleSheet("""
                QTreeView {
                    background-color: #f0f0f0;
                    alternate-background-color: #e0e0e0;
                    selection-background-color: #0078d7;
                    selection-color: white;
                    gridline-color: #cccccc;
                    border: 1px solid #cccccc;
                }
                QTreeView::item {
                    padding: 5px;
                }
                QTreeView::item:selected {
                    background-color: #0078d7;
                    color: white;
                }
                QTreeView::item:hover {
                    background-color: #d0d0d0;
                }
                QTreeView::item:focus {
                    outline: none;
                }
                QHeaderView::section {
                    background-color: #e0e0e0;
                    border: 1px solid #cccccc;
                    padding: 5px;
                }
                QHeaderView::section:checked {
                    background-color: #0078d7;
                    color: white;
                }
            """)
            

            你可以动态地更新 QTreeView 的内容,或者根据某些条件控制其行为。例如,在定时器或其他事件触发时更新树形视图的数据。

            import time
            from PyQt6.QtCore import QTimer
            
            class MyWindow(QWidget):
                def __init__(self):
                    super().__init__()
                    self.setWindowTitle("我的应用程序")
                    self.setGeometry(100, 100, 800, 600)
                  
                    # 初始化UI
                    self.initUI()
                  
                    # 创建定时器
                    self.timer = QTimer(self)
                    self.timer.timeout.connect(self.update_tree_view)
                    self.timer.start(5000)  # 每5秒触发一次
              
                def initUI(self):
                    layout = QVBoxLayout()
                  
                    # 创建树形视图
                    self.tree_view = QTreeView(self)
                  
                    # 创建模型
                    self.model = QStandardItemModel()
                    self.model.setHorizontalHeaderLabels(['名称', '类型'])
                  
                    # 添加数据
                    root_item = self.model.invisibleRootItem()
                    item1 = QStandardItem('项目1')
                    item1.appendRow([QStandardItem('子项目1.1'), QStandardItem('类型A')])
                    item1.appendRow([QStandardItem('子项目1.2'), QStandardItem('类型B')])
                    root_item.appendRow(item1)
                  
                    item2 = QStandardItem('项目2')
                    item2.appendRow([QStandardItem('子项目2.1'), QStandardItem('类型C')])
                    item2.appendRow([QStandardItem('子项目2.2'), QStandardItem('类型D')])
                    root_item.appendRow(item2)
                  
                    # 设置模型到视图
                    self.tree_view.setModel(self.model)
                  
                    # 添加到布局
                    layout.addWidget(self.tree_view)
                  
                    self.setLayout(layout)
              
                def update_tree_view(self):
                    # 更新模型数据
                    self.model.clear()
                    self.model.setHorizontalHeaderLabels(['名称', '类型'])
                  
                    # 添加新的数据
                    root_item = self.model.invisibleRootItem()
                    item1 = QStandardItem('项目1 (更新)')
                    item1.appendRow([QStandardItem('子项目1.1 (更新)'), QStandardItem('类型A')])
                    item1.appendRow([QStandardItem('子项目1.2 (更新)'), QStandardItem('类型B')])
                    root_item.appendRow(item1)
                  
                    item2 = QStandardItem('项目2 (更新)')
                    item2.appendRow([QStandardItem('子项目2.1 (更新)'), QStandardItem('类型C')])
                    item2.appendRow([QStandardItem('子项目2.2 (更新)'), QStandardItem('类型D')])
                    root_item.appendRow(item2)
            
            if __name__ == "__main__":
                app = QApplication([])
                window = MyWindow()
                window.show()
                app.exec()
            

            QTreeView 是 PyQt6/PySide6 中非常强大且灵活的控件,适用于各种需要展示和编辑树形结构数据的场景。通过设置不同的属性和使用样式表,你可以创建出丰富多样的树形视图样式。同时,通过信号与槽机制,你可以方便地处理用户的输入事件。希望以上内容能帮助你更好地理解和运用 QTreeView,并能够根据具体需求创建出功能丰富且用户友好的树形视图控件。

            到此这篇关于PyQt6/PySide6中QTreeView类的实现的文章就介绍到这了,更多相关PyQt6/PySide6 QTreeView类内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

            您可能感兴趣的文章:

            • Qt重写QTreeView自绘实现酷炫样式

            站内搜索