pyqt5-QTreeWidget

1、介绍

树形组件。实际上树组件很多特性和表格组件类似。

2、类和初始化

class QTreeWidget(QTreeView):
    """ QTreeWidget(parent: QWidget = None) """
    def __init__(self, parent=None):
        pass

快速整理:

QTreeWidget(parent: typing.Optional[QWidget] = None)
addTopLevelItem(self, item: QTreeWidgetItem)
addTopLevelItems(self, items: Iterable[QTreeWidgetItem])
clear(self)
closePersistentEditor(self, item: QTreeWidgetItem, column: int = 0)
collapseItem(self, item: QTreeWidgetItem)
columnCount(self) -> int
currentColumn(self) -> int
currentItem(self) -> QTreeWidgetItem
dropMimeData(self, parent: QTreeWidgetItem, index: int, data: QMimeData, action: Qt.DropAction) -> bool
editItem(self, item: QTreeWidgetItem, column: int = 0)
expandItem(self, item: QTreeWidgetItem)
findItems(self, text: str, flags: Union[Qt.MatchFlags, Qt.MatchFlag], column: int = 0) -> List[QTreeWidgetItem]
headerItem(self) -> QTreeWidgetItem
indexFromItem(self, item: QTreeWidgetItem, column: int = 0) -> QModelIndex
indexOfTopLevelItem(self, item: QTreeWidgetItem) -> int
insertTopLevelItem(self, index: int, item: QTreeWidgetItem)
insertTopLevelItems(self, index: int, items: Iterable[QTreeWidgetItem])
invisibleRootItem(self) -> QTreeWidgetItem
isFirstItemColumnSpanned(self, item: QTreeWidgetItem) -> bool
isPersistentEditorOpen(self, item: QTreeWidgetItem, column: int = 0) -> bool
itemAbove(self, item: QTreeWidgetItem) -> QTreeWidgetItem
itemAt(self, p: QPoint) -> QTreeWidgetItem
itemAt(self, ax: int, ay: int) -> QTreeWidgetItem
itemBelow(self, item: QTreeWidgetItem) -> QTreeWidgetItem
itemFromIndex(self, index: QModelIndex) -> QTreeWidgetItem
itemWidget(self, item: QTreeWidgetItem, column: int) -> QWidget
mimeData(self, items: Iterable[QTreeWidgetItem]) -> QMimeData
mimeTypes(self) -> List[str]
openPersistentEditor(self, item: QTreeWidgetItem, column: int = 0)
removeItemWidget(self, item: QTreeWidgetItem, column: int)
scrollToItem(self, item: QTreeWidgetItem, hint: QAbstractItemView.ScrollHint = QAbstractItemView.EnsureVisible)
selectedItems(self) -> List[QTreeWidgetItem]
setColumnCount(self, columns: int)
setCurrentItem(self, item: QTreeWidgetItem)
setCurrentItem(self, item: QTreeWidgetItem, column: int)
setCurrentItem(self, item: QTreeWidgetItem, column: int, command: Union[QItemSelectionModel.SelectionFlags, QItemSelectionModel.SelectionFlag])
setFirstItemColumnSpanned(self, item: QTreeWidgetItem, span: bool)
setHeaderItem(self, item: QTreeWidgetItem)
setHeaderLabel(self, alabel: str)
setHeaderLabels(self, labels: Iterable[str])
setItemWidget(self, item: QTreeWidgetItem, column: int, widget: QWidget)
setSelectionModel(self, selectionModel: QItemSelectionModel)
sortColumn(self) -> int
sortItems(self, column: int, order: Qt.SortOrder)
supportedDropActions(self) -> Qt.DropActions
takeTopLevelItem(self, index: int) -> QTreeWidgetItem
topLevelItem(self, index: int) -> QTreeWidgetItem
topLevelItemCount(self) -> int
visualItemRect(self, item: QTreeWidgetItem) -> QRect
---------------
dropEvent(self, event: QDropEvent)
event(self, e: QEvent) -> bool
---------------
currentItemChanged(self, current: QTreeWidgetItem, previous: QTreeWidgetItem) [signal]
itemActivated(self, item: QTreeWidgetItem, column: int) [signal]
itemChanged(self, item: QTreeWidgetItem, column: int) [signal]
itemClicked(self, item: QTreeWidgetItem, column: int) [signal]
itemCollapsed(self, item: QTreeWidgetItem) [signal]
itemDoubleClicked(self, item: QTreeWidgetItem, column: int) [signal]
itemEntered(self, item: QTreeWidgetItem, column: int) [signal]
itemExpanded(self, item: QTreeWidgetItem) [signal]
itemPressed(self, item: QTreeWidgetItem, column: int) [signal]
itemSelectionChanged(self) [signal]

3、属性

4、方法

(1)columnCount

默认,树组件的列数即为1

(2)setColumnCount

可以设置树组件的列数,一般是设置为1

 (3)currentColumn

返回当前的列索引

(4)sortColumn

当前树组件根据某列排序,返回该列索引,默认为0

(5)sortItems

参数1为列索引,表示根据排序的列

参数2为Qt.SortOrder类型,表示排序的规则,比如从小到大,从大到小

(6)setHeaderLabels

默认的,如果setColumnCount方法设置为n,那么头部标签名为1,2,..n

设置头部标签,参数是一组字符串,顺序替代对应位的值。

如果参数的字符串个数少于实际列数,则少的部分仍然是数字。如果个数多余实际列数,则相当于列数被设置为字符串个数。

self.window.treeWidget.setColumnCount(4)
self.window.treeWidget.setHeaderLabels(['b','a','c'])

self.window.treeWidget.setColumnCount(2)
self.window.treeWidget.setHeaderLabels(['b','a','c'])

(7)setHeaderLabel

只有一个字符串类型参数,即设置列索引为0的标签名,不影响其他列

(8)headerItem

返回的是一个QTreeWidgetItem对象,相当于获取了头部这一行。

headerItem().text(0)

返回头部的列索引为0的文本,如果列索引超出实际的范围,会返回空字符串

(9)setHeaderItem

参数为一个QTreeWidgetItem对象,设置树组件的头部,其效果和setHeaderLabels基本相同

setHeaderItem(QTreeWidgetItem(['a','b','c']))

(10)addTopLevelItem

参数为一个QTreeWidgetItem对象,直接设置为树组件中顶级的项。该项设置的字符串个数可以少于实际列数,不足的相当于空字符串。或多余实际列数,多余部分不显示。

addTopLevelItem(QTreeWidgetItem(['ABC']))
addTopLevelItem(QTreeWidgetItem(['123','DD','E','z']))

(11)addTopLevelItems

参数为一个可迭代的QTreeWidgetItem对象集合,直接设置为树组件中顶级的项

(12)insertTopLevelItem

参数1为索引,范围从0到topLevelItemCount-1,超出范围不报错、不执行。不影响topLevelItemCount的值

参数2为待插入的项,QTreeWidgetItem对象

(13)insertTopLevelItems

参数1为索引,范围从0到topLevelItemCount-1,超出范围不报错、不执行

参数2为待插入的项,一个可迭代的QTreeWidgetItem对象集合

(14)topLevelItem

参数为索引,返回对应的QTreeWidget对象

范围从0到topLevelItemCount-1,超出范围返回None

(15)topLevelItemCount

返回树组件中顶级的项的个数

(16)indexOfTopLevelItem

参数为一个QTreeWidget对象,返回其在树组件顶级的索引,未找到返回-1

需要注意,这里比较的是地址,即使两个项的显示值相同,但地址不同则不同

(17)takeTopLevelItem

参数为项索引,作用是从树组件中移除指定的项并作为返回值,返回类型即QTreeWidget

范围从0到topLevelItemCount-1,超出范围返回None

即使顶级项下存在子项,也可以直接删除,但是需要注意,删除了某索引项,其它后续的项索引会-1

(18)关于创建子项

self.window.treeWidget: QTreeWidget
self.window.treeWidget.setColumnCount(3)
self.window.treeWidget.setHeaderLabels(['a', 'b', 'c'])
self.window.treeWidget.addTopLevelItem(QTreeWidgetItem(['a0', 'b0', 'c0']))
self.window.treeWidget.addTopLevelItem(QTreeWidgetItem(['a1', 'b1', 'c1']))
self.window.treeWidget.addTopLevelItem(QTreeWidgetItem(['a2', 'b2', 'c2']))

item = self.window.treeWidget.topLevelItem(0)
QTreeWidgetItem(item).setText(0, 'x0')
QTreeWidgetItem(item).setText(0, 'y0')
QTreeWidgetItem(item).setText(1, 'y1')
QTreeWidgetItem(item).setText(1, 'y1')

item = self.window.treeWidget.topLevelItem(1)
item_1 = QTreeWidgetItem(item)
item_1.setText(0, 'x0')
item_1.setText(1, 'x1')
item_2 = QTreeWidgetItem(item)
item_2.setText(0, 'y0')
item_2.setText(1, 'y1')

item_2_1 = QTreeWidgetItem(item_1)
item_2_1.setText(0, 'z0')
item_2_1.setText(1, 'z1')
QTreeWidgetItem(item_1).setText(0, 'w0')

QTreeWidgetItem(self.window.treeWidget).setText(0, 'eeeee')

  • 创建树组件的子项时,并不直接依赖于树组件的方法,而是将树组件的某个项作为QTreeWidgetItem的参数,进行绑定。
  • 一个QTreeWidgetItem对象即一个项,会占据一行,其所在层次由指向的父项决定
  • 同一项下,同一层次的多个项顺序排列,该项的文本由setText方法的参数1列索引决定
  • 无论树组件有多少层,每个项都设置setText方法的参数1列索引指定0,则该文本值在树组件的索引0下显示排列
  • QTreeWidgetItem创建子项时,如果父项指定为树组件本身,那么就是创建顶级的项

 (19)expandAll

全部层次的全部子项,全部展开

(20)QTreeWidgetItem的parent方法

获取父项对象,返回也是QTreeWidgetItem类型。如果是顶级项,那么其调用parent方法,返回None

主要用于各级的项拼接使用

(21)clear

删除所有项,头部会保留

(22)collapseItem

参数为QTreeWidgetItem对象,作用是将该项的子项收起

(23)expandItem

参数为QTreeWidgetItem对象,作用是将该项的子项展开

(24)collapseAll

全部的子项收起

(25)scrollToItem

参数1为QTreeWidgetItem对象,参数2可以不用设置。

作用是滚动到指定项显示

(26)setCurrentItem

设置当前的QTreeWidgetItem对象,有三种形式

(27)删除节点

对于顶级的项,可以通过QTreeWidget的takeTopLevelItem方法移除。

对于非顶级的项,可以通过其父项QTreeWidgetItem对象的removeChild方法实现移除,参数为被删除项

(28)setHeaderHidden

设置参数为True,可以隐藏表头

(29)树组件可以实现多选,但默认情况下只能单选

5、事件

(1)currentItemChanged

点击项的改变事件

(2)itemActivated

项的激活事件

(3)itemChanged

项的改变

(4)itemClicked

项被点击,注意展开点击并不触发该事件,需要点击整体文本

(5)itemCollapsed

项被收起
(6)itemDoubleClicked

项被双击
(7)itemEntered

应该是点击项,然后enter键触发
(8)itemExpanded

项被展开事件
(9)itemPressed

项按下事件
(10)itemSelectionChanged

项选择改变事件

6、示例

import sys

from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton, QRadioButton, QCheckBox, QDialogButtonBox, \
    QComboBox, QFontComboBox, QLineEdit, QTextEdit, QPlainTextEdit, QSpinBox, QTreeWidget, QTreeWidgetItem
from PyQt5.uic import loadUi

"""
极简的窗口
"""


class my_window:
    def __init__(self):
        self.ui = loadUi('ui\\11_QTreeWidget.ui')
        self.ui: QMainWindow
        self.ui.treeWidget: QTreeWidget

        self.ui.pushButton: QPushButton
        self.ui.pushButton.clicked.connect(self.opt)

        self.ui.show()

    def opt(self):
        print("abc")
        self.ui.treeWidget: QTreeWidget

        self.myTree = self.ui.treeWidget
        # 设置列数
        self.myTree.setColumnCount(1)
        # 设置树形控件头部的标题
        self.myTree.setHeaderLabels(['机构列表'])

        # 设置根节点
        self.root = QTreeWidgetItem(self.myTree)
        self.root.setText(0, '本单位')

        # 设置树形控件的列的宽度
        self.myTree.setColumnWidth(0, 100)

        # 设置子节点1
        child1 = QTreeWidgetItem(self.root)
        child1.setText(0, '市场部')
        self.root.addChild(child1)

        # 设置子节点11
        child11 = QTreeWidgetItem(child1)
        child11.setText(0, '销售班')

        # 设置子节点2
        child2 = QTreeWidgetItem(self.root)
        child2.setText(0, '财务部')

        # 设置子节点21
        child21 = QTreeWidgetItem(child2)
        child21.setText(0, '财务一班')

        # 加载根节点的所有属性与子控件
        self.myTree.addTopLevelItem(self.root)

        # TODO 优化2 给节点添加响应事件
        self.myTree.clicked.connect(self.onClicked)

        # 节点全部展开
        self.myTree.expandAll()

    def onClicked(self):
        item = self.myTree.currentItem()
        print('Key=%s' % (item.text(0)))

if __name__ == "__main__":
    app = QApplication([])
    w = my_window()
    sys.exit(app.exec_())
posted @ 2023-04-16 23:41  挖洞404  阅读(1052)  评论(0编辑  收藏  举报