76-输入和显示-列表、表格、树-树结构控件QTreeWidget 及其项QTreeWidgetltem

树结构控件QTreeWidget 及其项QTreeWidgetltem

QTreeWidget 用来描述树。QTreeWidget 继承自 QTreeView,并且有自己内置的模型,每个项目都由 QtreeWidgetItem 构造。如果想构建更复杂的树,或者使用自定义模型,则需要使用QtreeView。

树结构控件QTreeWidget 继承自QTreeView类它是QTreeView 的便利类。

树结构控件由 1列或多列构成,没有行的概念。

树结构控件有 1个或多个顶层项,顶层项下面有任意多个子项,子项下面还可以有子项,顶层项没有父项。

顶层项和子项都是QTreeWidgetItem,每个QTreeWidgetItem 可以定义在每列显示的文字和图标,一般应在第1列中定义文字或图标,其他列中是否设置文字和图标,需要用户视情况而定。

可以把每个项理解成树结构控件的一行,只不过行之间有层级关系,可以折叠和展开。

用QTreeWidget 类创建树结构控件的方法如下。其中parent是QTreeWidget 树结构控件所在的父窗口或控件

from PySide6.QtWidgets import QTreeWidget

QTreeWidget(parent: Union[PySide6.QtWidgets.QWidget,NoneType]= None)-> None 

用QTreeWidgetItem类创建树结构项的方法如下。其中Sequence[str]表示字符串序列,是各列上的文字。

  • 第1个参数是QTreeWidget 时表示项追加到树结构控件中,这时新创建的项是顶层项;
  • 第1个参数是QTreeWidgetItem表示父项,这时新创建的项作为子项追加到父项下面;
  • 第2个参数是QTreeWidgetItem 时表示新创建的项插人到该项
from PySide6.QtWidgets import QTreeWidgetItem

QTreeWidgetItem(Other: PySide6.QtWidgets.QTreeWidgetItem)-> None
QTreeWidgetItem(parent: PySide6.QtWidgets.QTreeWidgetItem,after: PySide6.QtWidgets.QTreeWidgetItem,type: int = < ItemType.Type: 0 >)-> None
QTreeWidgetItem(parent: PySide6.QtWidgets.QTreeWidgetItem,strings: Sequence[str],type: int = < ItemType.Type: 0 >)-> None
QTreeWidgetItem(parent: PySide6.QtWidgets.QTreeWidgetItem,type: int = < ItemType.Type: 0 >)-> None
QTreeWidgetItem(strings: Sequence[str],type: int = < ItemType.Type: 0 >)-> None
QTreeWidgetItem(treeview: PySide6.QtWidgets.QTreeWidget,after: PySide6.QtWidgets.QTreeWidgetItem,type: int = < ItemType.Type: 0 >)-> None
QTreeWidgetItem(treeview: PySide6.QtWidgets.QTreeWidget,strings: Sequence[str],type: int = < ItemType.Type: 0 >)-> None
QTreeWidgetItem(treeview: PySide6.QtWidgets.QTreeWidget,type: int = < ItemType.Type: 0 >)-> None
QTreeWidgetItem(type: int = < ItemType.Type: 0 >)-> None
树结构控件 QTreeWidget 的常用方法

树结构控件 QTreeWidget 的常用方法如表所示主要方法介绍如下

树结构控件的列的数量由 setColumnCount(columns:int)方法定义,可以为项的每个列定义文字、图标、背景色和前景色、控件和角色值。

树结构控件可以添加顶层项,往项中添加子项需要用项的方法。

  • 用addTopLevelItem(QTreeWidgetItem)方法和 addTopLevelItems(Sequence[QTreeWidgetItem])方法添加顶层项;
    • 用insertTopLevelItem(index: int,QTreeWidgetItem)方法和 insertTopLevelItems(index; int,Sequence[QTreeWidgetItem])方法可以插人顶层;
  • 用takeTopLevelItem(index:int)方法可以移除顶层项,并返回该项;
  • 用topLevelItemCount()方法可以获取顶层项的数量;
  • 用topLevelItem(index;int)方法可以获取索引值是index 的顶层项。
  • 用setCurrentItem(QTreeWidgetItem)方法设置当前项,
  • 用setCurrentItem(QTreeWidgetItem,column:int)方法设置当前项和当前列,用currentItem()方法获取当前项。
  • 用setHeaderItem(QTreeWidgetItem)方法可以设置表头项,
    • 用setHeaderLabel(label:str)方法和 setHeaderLabels(labels;Sequence[str])方法设置表头文字。
  • 用collapseItem(QTreeWidgetItem)方法可以折叠指定的项
    • 用collapseAlI()方法可以折叠所有的项,
  • 用expandItem(QTreeWidgetItem)方法可以展开指定的项
    • 用expandAl1()方法可以展开所有的项。

对QListWidget和QTableWidget 的介绍非常详细。本节对QTreeWidget的介绍相对简单一些,只提供一些用来显示数据的基本操作,因为 QTreeWidget 仅仅用来显示数据。

构建一个QtreeWidget实例之后,首先要使用setColumnCount()函数设置树有几列,然后通过columnCount()函获取这个数字。代码如下:

self.treewidget = QTreeWidget()
self.treewidget.setColumnCount(3)

树可以设置标题,既可以使用setHeaderLabels()函数快速设置,也可以使用QTreeWidgetItem()函由构造更复杂的标题,如下所示构谐白定义标照并逐加列

#方式1
self,treeWidget,setHeaderLabels(['学科','姓名','分数'])
                                 
# 方式2
item = QTreeWidgetItem()
item.setText(0,'学科')
item.setText(1,'姓名')
item.setText(2,'分数')
item.setIcon(0,QIcon('./images/root .png'))
self.treeWidget.setHeaderItem(item)

创建item 也有另一种快捷方式,效果是一样的:

item = QTreewidgetItem(['学科','姓名','分数'])
item.setIcon(0,QIcon('./images/root.png'))
self.treeWidget.setHeaderItem(item)

初始化树实例,定义了树的列数,并且设置了标题之后,接下来就是创建树的内容

QTreeWidget的方法及参数类型说明
setColumnCount(columns: int)设置列数
columnCount()获取列数
currentColumn()获取当前列
setColumnWidth(column:int,width:int)设置列的宽度
setColumnHidden(column:int,hide:bool)设置列是否隐藏
addTopLevelltem(QTreeWidgetItem)添加顶层项
addTopLevelItems(Sequence[QTreeWidgetItem])添加多个顶层项
insertTopLevelltem(index: int,QTreeWidgetItem)插人顶层项
insertTopLeveltems(index: int,Sequence[QTreeWidgetltem])插入多个顶层项
takeTopLevelltem(index: int)移除顶层项,并返回移除的项
1opLevelItem(index:int)获取索引值是int的顶层项
topLevelItemCount()获取顶层项的数量
setCurrentItem(QTreeWidgetltem)把指定的项设置成当前项
setCurrentItem(QTreeWidgetItem,column:int)设置当前项和当前列
currentItem()获取当前项
editItem(QTreeWidgetItem,column:int=0)开始编辑项
findItems(str,Qt.MatchFlag,column:int=0)搜索项,返回项的列表
setHeaderItem(QTreeWidgetItem)设置表头
setHeaderLabel(label:str)设置表头第1列文字
setHeaderLabels(labels: Sequence[str])设置表头文字
headerItem():0830109293319获取表头项
indexOfTopLevelItem(QTreeWidgetltem)获取顶层项的索引值
invisiblerootItem()获取不可见的根项
itemAbove(QTreeWidgetltem)获取指定项之前的项
itemBelow(QTreeWidgetItem)获取指定项之后的项
itemAr(QPoint)获取指定位置的项
itemAt(x:int,y:int)获取指定位置的项
openPersistentEditor(QTreeWidgetItem,column=0)打开编辑框
isPersistentEditorOpen(QTreeWidgetItem,column=0)获取编辑框是否已经打开
closePersistentEditor(QTreeWidgetItem,column=0)关闭编辑框
[slot]scrolToItem(QTreeWidgetItem)滚动树结构,使指定的项可见
selectedItems()获取选中的项列表
setFirstItemColumnSpanned(QTreeWidgetItem,bool)只显示指定项的第1列的值
isFirstItemColumnSpanned(QTreeWidgetItem)获取是否只显示第1列的值
setItemWidget(QTreeWidgetItem,column: int,QWidget)在指定项的指定列设置控件
itemWidget(QTreeWidgetItem,column:int)获取项上的控件
removeItem Widget(QTreeWidgetItem,column:int)移除项上的控件
[slot]collapseItem(QTreeWidgetItem)折叠项
collapseA1()折叠所有的项
[slot]expandItem(QTreeWidgetItem)展开项
expandAII()展开所有的项
[slot]clear()清空所有项
树结构控件QTreeWidget 的信号

树结构控件QTreeWidget 的信号如表所示

QTreeWidget的信号及参数类型说明
currentItemChanged(currentltem,previousItem)当前项发生改变时发送信号
itemActivated(item,column)项变成活跃项时发送信号
itemChanged(item,column)项发生改变时发送信号
itemClicked(item,column)单击项时发送信号
itemDoubleClicked(item,column)双击项时发送信号
itemEntered(item,column)光标进人项时发送信号
itemPressed(item,column)在项上按下鼠标按键时发送信号
itemExpanded(item)展开项时发送信号
itemCollapsed(item)折叠项时发送信号
itemSelectionChanged()选择的项发生改变时发送信号
树结构项QTreeWidgetItem

QTreeWidgetItem类提供了一个与QTreeWidget便利类一起使用的项。

from PySide6.QtWidgets import QTreeWidgetItem

QTreeWidgetItem(other: PySide6.QtWidgets.QTreeWidgetItem)-> None
QTreeWidgetItem(parent: PySide6.QtWidgets.QTreeWidgetItem, after: PySide6.QtWidgets.QTreeWidgetItem, type: int = < ItemType.Type: 0 >)-> None
QTreeWidgetItem(parent: PySide6.QtWidgets.QTreeWidgetItem, strings: Sequence[str], type: int = < ItemType.Type: 0 >)-> None
QTreeWidgetItem(parent: PySide6.QtWidgets.QTreeWidgetItem, type: int = < ItemType.Type: 0 >)-> None
QTreeWidgetItem(strings: Sequence[str], type: int = < ItemType.Type: 0 >)-> None
QTreeWidgetItem(treeview: PySide6.QtWidgets.QTreeWidget, after: PySide6.QtWidgets.QTreeWidgetItem, type: int = < ItemType.Type: 0 >)-> None
QTreeWidgetItem(treeview: PySide6.QtWidgets.QTreeWidget, strings: Sequence[str], type: int = < ItemType.Type: 0 >)-> None
QTreeWidgetItem(treeview: PySide6.QtWidgets.QTreeWidget, type: int = < ItemType.Type: 0 >)-> None
QTreeWidgetItem(type: int = < ItemType.Type: 0 >)-> None 

treeview – PySide6.QtWidgets.QTreeWidget

other – PySide6.QtWidgets.QTreeWidgetItem

after – PySide6.QtWidgets.QTreeWidgetItem

typeint

parent – PySide6.QtWidgets.QTreeWidgetItem

strings – list of strings
  • 构造指定类型的树小部件项,并将其插入到前面项之后的给定父项中。
  • 构造指定类型的树小部件项,并将其附加到给定父级中的项。给定的字符串列表将被设置为项目中每列的项目文本。
  • 构造指定类型的树小部件项,并将其附加到给定父级中的项。
  • 构造指定类型的树窗口小部件项,该项在前一个子项之后插入到父项中。
  • 构造一个树小部件项,并将其附加到给定的父级。给定的字符串列表将被设置为项目中每列的项目文本。
  • 构造一个树小部件项,并将其附加到给定的父级。
  • 构造指定类型的树小部件项。该项必须插入到树小部件中。给定的字符串列表将被设置为项目中每列的项目文本。
  • 构造其他的副本。请注意,type()和treeWidget()不会被复制。当重新实现clone()时,此函数非常有用。
  • 构造指定类型的树小部件项。该项必须插入到树小部件中。
树结构项QTreeWidgetItem官方描述

树小部件项用于保存树小部件的信息行。行通常包含几列数据,每列数据可以包含一个文本标签和一个图标。
QTreeWidgetItem类是一个方便类,它取代了Qt 3中的QListViewItem类。它提供了一个与QTreeWidget类一起使用的项。
项通常由一个父项构造,该父项要么是QTreeWidget(用于顶级项),要么是QTree WidgetItem(用于树的较低级别上的项)。例如,以下代码构造了一个顶级项目来表示世界上的城市,并添加了一个奥斯陆条目作为子项目:

cities = QTreeWidgetItem(treeWidget)
cities.setText(0, tr("Cities"))
osloItem = QTreeWidgetItem(cities)
osloItem.setText(0, tr("Oslo"))
osloItem.setText(1, tr("Yes"))

项目可以按特定顺序添加,方法是指定它们在构建时所遵循的项目:

planets = QTreeWidgetItem(treeWidget, cities)

项目中的每一列都可以有自己的背景笔刷,该笔刷是通过setBackground()函数设置的。当前的背景笔刷可以通过background()找到。每一列的文本标签都可以用自己的字体和画笔呈现。这些是用setFont()和setForeground()函数指定的,并用font()和foreground(。
顶级项和树的较低级别中的项之间的主要区别在于,顶级项没有parent()。这些信息可以用来区分项目之间的区别,并且在从树中插入和删除项目时很有用。可以使用takeChild()移除项的子项,并使用insertChild()函数将其插入子项列表中的给定索引处。
默认情况下,项目是启用的、可选择的、可检查的,并且可以是拖放操作的来源。可以通过使用适当的值调用setFlags()来更改每个项目的标志(请参见ItemFlags)。可检查项可以使用setCheckState()函数进行检查和取消检查。相应的checkState()函数指示该项当前是否已被检查。

子类别化

当对QTreeWidgetItem进行子类化以提供自定义项时,可以为它们定义新的类型,以便将它们与标准项区分开来。需要此功能的子类的构造函数需要调用具有等于或大于UserType的新类型值的基类构造函数。

树结构项QTreeWidgetItem方法
  • PySide6.QtWidgets.QTreeWidgetItem.ItemType

(继承enum.IntEnum)此枚举描述用于描述树小部件项的类型。您可以在QTreeWidgetItem子类中定义新的用户类型,以确保对自定义项进行特殊处理;例如,当项目被排序时。

ConstantDescription
QTreeWidgetItem.Type树小部件项的默认类型。
QTreeWidgetItem.UserType自定义类型的最小值。UserType以下的值由Qt保留。
  • PySide6.QtWidgets.QTreeWidgetItem.ChildIndicatorPolicy

    ConstantDescription
    QTreeWidgetItem.ShowIndicator即使没有子项,也会显示此项目的展开和折叠控件。
    QTreeWidgetItem.DontShowIndicator即使有子对象,也永远不会显示用于展开和折叠的控件。如果节点被强制打开,则用户将无法展开或折叠项目。
    QTreeWidgetItem.DontShowIndicatorWhenChildless如果项目包含子项,则将显示用于展开和折叠的控件。

树结构项QTreeWidgetItem 的常用方法如表所示,主要方法介绍如下

  • 用addChild(QIreeWidgetItem)方法或addChildren(Sequence[QTreeWidgetItem])方法可以为项添加子项

    • 用insertChild(index;int,QTreeWidgetItem)方法或insertChildren(index:int,Sequence[QTreeWidgetItem])方法可以在项的子项中插人子项,
    • 用childCount()方法可以获取子项的数量,
    • 用child(index:int)方法可以获取指定索引号的子项。
  • 用takeChild(int)方法移除指定索引号的项,并返回该项;

    • 用removeChild(QTreeWidgetItem)方法移除指定的子项;
    • 用takeChildren()方法移除所有的子项,并返回子项列表。
  • 用setText(index:int,str)方法设置项的第int 列的文字,

    • 用setIcon(index:int;QIcon)方法设置项的第int列的图标,
    • 用setFont(index;int,QFont)方法设置项的第int列的字体,
    • 用setBackground(index:int,QColor)方法设置项第int列的背景色,
    • 用setForeground(index:int,QColor)方法设置项第int列的前景色
  • 用setCheckState(column:int,Qt.CheckState)方法设置项的第 int 列的选状态,其中Qt.CheckState可以取以下值;用checkState(column;int)方法获取项的勾选状态。

    • Qt.Unchecked(未勾选)
    • QtPartiallyChecked(部分勾选,如果有子项)
    • Qt.Checked(勾选)
  • 用setExpanded(True)方法展开项

    • 用setExpanded(False)方法折叠项
  • 用setChildIndicatorPolicy(QTreeWidgetItem,ChildIndicatorPolicy)方法设置展开折叠标识的显示策略,其中QTreeWidgetItem.ChildIndicatorPolicy 可以取:

    • QTreeWidgetItem.ShowIndicator(不论有没有子项,都显示标识)
    • QTreeWidgetItem.DontShowIndicator(即便有子项,也不显示标识)
    • QTreeWidgetItem.DontShowIndicatorWhenChildless(当没有子项时不显示标识)
QTreeWidgetItem 的方法及参数类型说 明
addChild(child: PySide6.QtWidgets.QTreeWidgetItem)-> None将子项追加到子项列表中。
addChildren(children: Sequence[PySide6.QtWidgets.QTreeWidgetItem])-> None将给定的子项列表附加到该项。
background(column: int)-> PySide6.QtGui.QBrush返回用于渲染指定列的背景的笔刷。
checkState(column: int)-> PySide6.QtCore.Qt.CheckState返回给定列中标签的检查状态。
child(index: int)-> PySide6.QtWidgets.QTreeWidgetItem返回项的子项列表中给定索引处的项。
childCount()-> int返回子项的数目。
childIndicatorPolicy()-> PySide6.QtWidgets.QTreeWidgetItem.ChildIndicatorPolicy返回项目指示符策略。此策略决定何时显示树枝展开/折叠指示器。
clone()-> PySide6.QtWidgets.QTreeWidgetItem创建项及其子项的深度副本。
columnCount()-> int返回项目中的列数。
data(column: int, role: int)-> Any返回项的列和角色的值。
emitDataChanged()-> None使与此项关联的模型为此项发出dataChanged()信号。
通常,只有在已经子类化了QTreeWidgetItem并重新实现了data()和/或setData()的情况下,才需要调用此函数。
flags()-> PySide6.QtCore.Qt.ItemFlag返回用于描述项目的标志。这些决定了是否可以检查、编辑和选择项目。标志的默认值为`ItemIsSelectable
font(column: int)-> PySide6.QtGui.QFont返回用于呈现指定列中的文本的字体。
foreground(column: int)-> PySide6.QtGui.QBrush返回用于渲染指定列的前景(例如文本)的画笔。设置默认构造的笔刷将使视图使用样式中的默认颜色。
icon(column: int)-> PySide6.QtGui.QIcon返回显示在指定列中的图标。
indexOfChild(child: PySide6.QtWidgets.QTreeWidgetItem)-> int返回项的子项列表中给定子项的索引。
insertChild(index: int, child: PySide6.QtWidgets.QTreeWidgetItem)-> None在子项列表的索引处插入子项。
如果子项已经插入到其他位置,则不会再次插入。
insertChildren(index: int, children: Sequence[PySide6.QtWidgets.QTreeWidgetItem])-> None将给定的子项列表插入索引处的项子项列表中。
已经插入其他位置的子项将不会被插入。
isDisabled()-> bool如果项目被禁用,则返回true;否则返回false。
isExpanded()-> bool如果项已展开,则返回true,否则返回false。
isFirstColumnSpanned()-> bool如果项跨越一行中的所有列,则返回true;否则返回false。
isHidden()-> bool如果项是隐藏的,则返回true,否则返回false。
isSelected()-> bool如果选择了项,则返回true,否则返回false。
__lt__(other:PySide6.QtWidgets.QTreeWidgetItem)->bool如果项中的文本小于另一项中的文字,则返回true,否则返回false。
parent()-> PySide6.QtWidgets.QTreeWidgetItem返回项目的父级。
read(in_: PySide6.QtCore.QDataStream)-> None从中的流中读取项目。这只会将数据读取到单个项目中。
removeChild(child: PySide6.QtWidgets.QTreeWidgetItem)-> None删除由子项指示的给定项。删除的项目将不会被删除。
setBackground(column: int, brush: Union[PySide6.QtGui.QBrush, PySide6.QtCore.Qt.BrushStyle, PySide6.QtCore.Qt.GlobalColor, PySide6.QtGui.QColor, PySide6.QtGui.QGradient, PySide6.QtGui.QImage, PySide6.QtGui.QPixmap])-> None将给定列中标签的背景笔刷设置为指定的笔刷。设置默认构造的笔刷将使视图使用样式中的默认颜色。
setCheckState(column: int, state: PySide6.QtCore.Qt.CheckState)-> None将处于给定列检查状态的项设置为state。
setChildIndicatorPolicy(policy: PySide6.QtWidgets.QTreeWidgetItem.ChildIndicatorPolicy)-> None设置项目指标策略。此策略决定何时显示树枝展开/折叠指示器。默认值为DontShowIndicator WhenChildless。
setData(column: int, role: int, value: Any)-> None将项的列和角色的值设置为给定值。
角色描述由值指定的数据类型,并由ItemDataRole枚举定义。
setDisabled(disabled: bool)-> None如果禁用为true,则禁用该项目;否则将启用该项目。
setExpanded(expand: bool)-> None如果expand为true,则展开项目,否则折叠项目。
setFirstColumnSpanned(span: bool)-> None如果span为true,则将第一节设置为跨所有列;否则将显示所有项目部分。
setFlags(flags: PySide6.QtCore.Qt.ItemFlag)-> None将项目的标志设置为给定的标志。这些决定了项目是否可以被选择或修改。这通常用于禁用项目。
setFont(column: int, font: Union[PySide6.QtGui.QFont, str, Sequence[str]])-> None将用于显示给定列中文本的字体设置为给定字体。
setForeground(column: int, brush: Union[PySide6.QtGui.QBrush, PySide6.QtCore.Qt.BrushStyle, PySide6.QtCore.Qt.GlobalColor, PySide6.QtGui.QColor, PySide6.QtGui.QGradient, PySide6.QtGui.QImage, PySide6.QtGui.QPixmap])-> None将给定列中标签的前景笔刷设置为指定的笔刷。
setHidden(hide: bool)-> None如果隐藏为true,则隐藏项目,否则显示项目。如果项目当前不在视图中,则对此函数的调用无效。特别是,对一个项调用setHidden(true),然后将其添加到视图中,会得到一个可见的项。
setIcon(column: int, icon: Union[PySide6.QtGui.QIcon, PySide6.QtGui.QPixmap])-> None将要在给定列中显示的图标设置为图标。
setSelected(select: bool)-> None设置要选择的项目的选定状态。
setSizeHint(column: int, size: PySide6.QtCore.QSize)-> None将给定列中树项的大小提示设置为大小。如果未设置大小提示或大小无效,则项目委托将根据项目数据计算大小提示。
setStatusTip(column: int, statusTip: str)-> None将给定列的状态提示设置为给定的状态提示。需要启用QTreeWidget鼠标跟踪才能使此功能正常工作。
setText(column: int, text: str)-> None将要在给定列中显示的文本设置为给定文本。
setTextAlignment(column: int, alignment: PySide6.QtCore.Qt.AlignmentFlag)-> None
setTextAlignment(column: int, alignment: int)-> None
使用采用Alignment参数的重载。将给定列中标签的文本对齐方式设置为指定的对齐方式。
将给定列中标签的文本对齐方式设置为指定的对齐方式。
setToolTip(column: int, toolTip: str)-> None将给定列的工具提示设置为tooltip。
setWhatsThis(column: int, whatsThis: str)-> None将给定列的"What’s This?"帮助设置为whatsThis。
sizeHint(column: int)-> PySide6.QtCore.QSize返回给定列中树项的大小提示集(请参见QSize)。
sortChildren(column: int, order: PySide6.QtCore.Qt.SortOrder)-> None根据给定列中的值,使用给定的顺序对项的子项进行排序。
statusTip(column: int)-> str返回给定列内容的状态提示。
takeChild(index: int)-> PySide6.QtWidgets.QTreeWidgetItem删除索引处的项并返回该项,否则返回0。
takeChildren()-> List[PySide6.QtWidgets.QTreeWidgetItem]删除子项列表并返回,否则返回一个空列表。
text(column: int)-> str返回指定列中的文本。
textAlignment(column: int)-> int返回给定列中标签的文本对齐方式。
toolTip(column: int)-> str返回给定列的工具提示。
treeWidget()-> PySide6.QtWidgets.QTreeWidget返回包含该项的树小部件。
type()-> int返回传递给QTreeWidgetItem构造函数的类型。
whatsThis(column: int)-> str返回给定列内容的"这是什么?"帮助。
write(out: PySide6.QtCore.QDataStream)-> None写入要流式输出的项。这只会从一个项目中写入数据。
树结构控件QTreeWidget 的应用实例

image-20230326212353612

# -*- coding: UTF-8 -*-
# File date: Hi_2023/3/26 21:24
# File_name: 06-树结构控件QTreeWidget的应用实例.py


from PySide6.QtWidgets import *
from PySide6.QtGui import *
from PySide6.QtCore import *
import sys
import random
import os

os.chdir(os.path.dirname(__file__))


class QTreeWidgetDemo(QMainWindow):

    def __init__(self,parent=None):
        super(QTreeWidgetDemo,self).__init__(parent)
        self.setWindowTitle("QTreeWidget案例")
        self.resize(500,600)
        self.text = QPlainTextEdit('用来显示QTreeWidget相关信息:')
        self.treeWidget = QTreeWidget()

        layout = QVBoxLayout(self)
        layout.addWidget(self.treeWidget)
        layout.addWidget(self.text)

        widget = QWidget()
        self.setCentralWidget(widget)
        widget.setLayout(layout)

        self.initItem()

        # selection
        # self.listWidget.setSelectionMode(QAbstractItemView.SingleSelection)
        self.treeWidget.setSelectionMode(QAbstractItemView.ExtendedSelection)
        # self.treeWidget.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.treeWidget.setSelectionBehavior(QAbstractItemView.SelectItems)
        self.treeWidget.setMouseTracking(True)

        # 信号与槽
        self.treeWidget.currentItemChanged[QTreeWidgetItem,QTreeWidgetItem].connect(self.onCurrentItemChanged)
        self.treeWidget.itemActivated[QTreeWidgetItem,int].connect(self.onItemActivated)
        self.treeWidget.itemClicked[QTreeWidgetItem,int].connect(self.onItemClicked)
        self.treeWidget.itemDoubleClicked[QTreeWidgetItem,int].connect(lambda item,column: self.text.appendPlainText(f'"{item.text(column)}"触发itemDoubleClicked信号:'))
        self.treeWidget.itemChanged[QTreeWidgetItem,int].connect(lambda item,column: self.text.appendPlainText(f'"{item.text(column)}"触发itemChanged信号:'))
        self.treeWidget.itemEntered[QTreeWidgetItem,int].connect(lambda item,column: self.text.appendPlainText(f'"{item.text(column)}"触发itemEntered信号:'))
        self.treeWidget.itemPressed[QTreeWidgetItem,int].connect(lambda item,column: self.text.appendPlainText(f'"{item.text(column)}"触发itemPressed信号:'))
        self.treeWidget.itemSelectionChanged.connect(lambda: self.text.appendPlainText(f'触发itemSelectionChanged信号:'))
        self.treeWidget.clicked.connect(self.onClicked)

    def initItem(self):
        # 设置列数
        self.treeWidget.setColumnCount(3)
        # 设置树形控件头部的标题
        self.treeWidget.setHeaderLabels(['学科','姓名','分数'])

        # 设置根节点
        root = QTreeWidgetItem(self.treeWidget)
        root.setText(0,'学科')
        root.setText(1,'姓名')
        root.setText(2,'分数')
        root.setIcon(0,QIcon('./images/root.png'))

        # 设置根节点的背景颜色
        root.setBackground(0,QBrush(Qt.blue))
        root.setBackground(1,QBrush(Qt.yellow))
        root.setBackground(2,QBrush(Qt.red))

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

        # 设置子节点1
        for subject in ['语文','数学','外语','综合']:
            child1 = QTreeWidgetItem([subject,'',''])
            root.addChild(child1)
            # 设置子节点2
            for name in ['张三','李四','王五','赵六']:
                child2 = QTreeWidgetItem()
                child2.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEditable | Qt.ItemIsEnabled | Qt.ItemIsUserCheckable)
                child2.setText(1,name)
                score = random.random()* 40 + 60
                child2.setText(2,str(score)[:5])
                if score >= 90:
                    child2.setBackground(2,QBrush(Qt.red))
                elif 80 <= score < 90:
                    child2.setBackground(2,QBrush(Qt.darkYellow))
                child1.addChild(child2)

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

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

        # 启用排序
        self.treeWidget.setSortingEnabled(True)

    def onClicked(self,index):
        item = self.treeWidget.currentItem()
        self.text.appendPlainText(f'触发clicked信号,点击了:"{item.text(index.column())}"')

    def onCurrentItemChanged(self,current: QTreeWidgetItem,previous: QTreeWidgetItem):
        if previous == None:
            _str = f'触发currentItemChanged信号,当前项:"{current.text(0)}-{current.text(1)}-{current.text(2)}",之前项:None'
        else:
            _str = f'触发currentItemChanged信号,当前项:"{current.text(0)}-{current.text(1)}-{current.text(2)}",之前项:"{previous.text(0)}-{previous.text(1)}-{previous.text(2)}"'
        self.text.appendPlainText(_str)

    def onItemClicked(self,item: QTreeWidgetItem,column: int):
        self.text.appendPlainText(f'"{item.text(column)}"触发itemClicked信号:')
        return

    def onItemActivated(self,item: QTreeWidgetItem,column: int):
        self.text.appendPlainText(f'"{item.text(column)}"触发itemActivated信号:')
        return


if __name__ =="__main__":
    app = QApplication(sys.argv)
    demo = QTreeWidgetDemo()
    demo.show()
    sys.exit(app.exec())

下面的程序建立一个树结构控件,单击树结构控件的子项,可以把子项上的内容输出程序运行界面如图所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dZZ2cCYA-1686496991661)(C:\Users\Hi\AppData\Roaming\Typora\typora-user-images\image-20230304234931384.png)]

# -*- coding: UTF-8 -*-
# File date: Hi_2023/3/4 21:42
# File_name: 03-树结构控件QTreeWidget的应用实例.py

from PySide6.QtWidgets import QApplication,QWidget,QSplitter,QTextBrowser,QHBoxLayout,QTreeWidget,QTreeWidgetItem
from PySide6.QtCore import Qt
import sys


class MyWindow(QWidget):
    def __init__(self,parent=None):
        super().__init__(parent)
        self.resize(900,600)

        self.widget_setupUi()
        self.treeWidget_setUp()

    def widget_setupUi(self):  # 建立主程序界面
        h = QHBoxLayout(self)
        splitter = QSplitter(Qt.Horizontal,self)
        h.addWidget(splitter)
        self.treeWidget = QTreeWidget()
        self.textBrowser = QTextBrowser()
        splitter.addWidget(self.treeWidget)
        splitter.addWidget(self.textBrowser)

    def treeWidget_setUp(self):  # 建立树结构控件
        self.treeWidget.setColumnCount(2)# 设置列数
        header = QTreeWidgetItem()# 表头项
        header.setText(0,"噪声源")
        header.setText(1,"噪声值")
        header.setTextAlignment(0,Qt.AlignCenter)
        header.setTextAlignment(1,Qt.AlignCenter)
        self.treeWidget.setHeaderItem(header)

        self.topItem_1 = QTreeWidgetItem(self.treeWidget)# 顶层项
        self.topItem_1.setText(0,"高铁")

        child_1 = QTreeWidgetItem(self.topItem_1,["结构噪声","70"])
        child_2 = QTreeWidgetItem(self.topItem_1,["电机噪","60"])
        child_3 = QTreeWidgetItem(self.topItem_1,["空调噪声","44"])
        child_4 = QTreeWidgetItem(self.topItem_1,["气动噪声"])
        child_5 = QTreeWidgetItem(child_4,["受电弓噪声","66"])
        child_6 = QTreeWidgetItem(child_4,["外壳气流噪声","66"])

        self.topItem_2 = QTreeWidgetItem(self.treeWidget)
        self.topItem_2.setText(0,"地铁")
        child_7 = QTreeWidgetItem(self.topItem_2,["结构噪声","60"])
        child_8 = QTreeWidgetItem(self.topItem_2,["电机噪声","50"])
        child_9 = QTreeWidgetItem(self.topItem_2,["空调噪声","44"])
        child_10 = QTreeWidgetItem(self.topItem_2,["气动噪声"])
        child_11 = QTreeWidgetItem(child_10,["受电弓噪声","56"])
        child_12 = QTreeWidgetItem(child_10,["外壳气流噪声","56"])

        self.treeWidget.itemClicked.connect(self.treeWidget_clicked)# 信号与槽的连接
        self.treeWidget.expandAll()

    def treeWidget_clicked(self,item,column):
        if item.text(1)!="":
            self.textBrowser.append("噪声源:%s 噪声值:%s"%(item.text(0),item.text(1)))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = MyWindow()

    win.show()
    sys.exit(app.exec())

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

士别三日,当挖目相待

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值