PyQt6/PySide6中QTreeView类的实现

2025-04-27 17:50
文章标签 实现 pyside6 qtreeview pyqt6

本文主要是介绍PyQt6/PySide6中QTreeView类的实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《PyQt6/PySide6中QTreeView类的实现》QTreeView是PyQt6或PySide6库中用于显示分层数据的控件,本文主要介绍了PyQt6/PySide6中QTreeView类的实现...

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

1. 基本概念

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

2. 创建 QTreeView 实例

要使用 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.clCIHpEWMicked.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()

3. QTreeView 的常用属性和方法

属性

  • 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):显示指定行。

4. 详细示例

设置模型

# 创建模型
model = QStandardItemModel()
model.setHorizontalHeaderLabels(['名称', '类型'])

# 添加数据
root_item = model.invisibleRootItem()
item1 = QStandardItem('项目1')
item1.appendRow([QStandardItem('子项目1.1'), QStandardItem('类型A')])
item1.appendRow([QStandardItem('子项目1.2'), QStanjavascriptdardItem('类型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()

选择行或列

# 选择第javascript1行
tree_view.selectRowww.chinasem.cnw(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("查看和编辑数据")

5. 信号与槽机制

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)

6. 自定义样式

除了使用内置的样式设置外,你还可以通过样式表(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;
    }
""")

7. 动态更新和控制

你可以动态地更新 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)
      
        sejavascriptlf.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类内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于PyQt6/PySide6中QTreeView类的实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154397

相关文章

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I

基于Java和FFmpeg实现视频压缩和剪辑功能

《基于Java和FFmpeg实现视频压缩和剪辑功能》在视频处理开发中,压缩和剪辑是常见的需求,本文将介绍如何使用Java结合FFmpeg实现视频压缩和剪辑功能,同时去除数据库操作,仅专注于视频处理,需... 目录引言1. 环境准备1.1 项目依赖1.2 安装 FFmpeg2. 视频压缩功能实现2.1 主要功

使用Python实现无损放大图片功能

《使用Python实现无损放大图片功能》本文介绍了如何使用Python的Pillow库进行无损图片放大,区分了JPEG和PNG格式在放大过程中的特点,并给出了示例代码,JPEG格式可能受压缩影响,需先... 目录一、什么是无损放大?二、实现方法步骤1:读取图片步骤2:无损放大图片步骤3:保存图片三、示php

使用Python实现一个简易计算器的新手指南

《使用Python实现一个简易计算器的新手指南》计算器是编程入门的经典项目,它涵盖了变量、输入输出、条件判断等核心编程概念,通过这个小项目,可以快速掌握Python的基础语法,并为后续更复杂的项目打下... 目录准备工作基础概念解析分步实现计算器第一步:获取用户输入第二步:实现基本运算第三步:显示计算结果进

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

Python利用PySpark和Kafka实现流处理引擎构建指南

《Python利用PySpark和Kafka实现流处理引擎构建指南》本文将深入解剖基于Python的实时处理黄金组合:Kafka(分布式消息队列)与PySpark(分布式计算引擎)的化学反应,并构建一... 目录引言:数据洪流时代的生存法则第一章 Kafka:数据世界的中央神经系统消息引擎核心设计哲学高吞吐

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

Java调用Python脚本实现HelloWorld的示例详解

《Java调用Python脚本实现HelloWorld的示例详解》作为程序员,我们经常会遇到需要在Java项目中调用Python脚本的场景,下面我们来看看如何从基础到进阶,一步步实现Java与Pyth... 目录一、环境准备二、基础调用:使用 Runtime.exec()2.1 实现步骤2.2 代码解析三、

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图

Python如何实现高效的文件/目录比较

《Python如何实现高效的文件/目录比较》在系统维护、数据同步或版本控制场景中,我们经常需要比较两个目录的差异,本文将分享一下如何用Python实现高效的文件/目录比较,并灵活处理排除规则,希望对大... 目录案例一:基础目录比较与排除实现案例二:高性能大文件比较案例三:跨平台路径处理案例四:可视化差异报