当前位置: 代码网 > it编程>编程语言>Java > PyQt6/PySide6中QTreeView类的实现

PyQt6/PySide6中QTreeView类的实现

2025年04月27日 Java 我要评论
qtreeview是 pyqt6 或 pyside6 库中用于显示分层数据的控件。它适用于展示树形结构的数据,如文件系统、组织结构等。qtreeview也是基于模型-视图架构的,通常与qabstrac

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.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()

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'), 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("查看和编辑数据")

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)
      
        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类内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com