QTreeWidget
QTreeWidget 是一种Item Widget 组件。QTreeWidget组件被称为树形组件,它的项(item)被称为节点,一个树形组件内的所有节点组成的结构称为目录树。树形组件适合显示具有层级结构的数据,如Windows 资源管理器中显示的文件系统就是一种典型的的层级结构。
本章学习了QTreeWidget的使用方法,并设计了一个示例项目2024_6_27 ,示例项目运行时界面如图1-1所示,示例的窗口基类是QMainWindow,通过Action设计了菜单栏和状态栏,这个示例实现了一个简单的图片管理器,主要会用到以下几个组件的使用方法。

(1)QTreeWidget 树形组件,示例使用树形组件管理目录和图片文件,可以添加或删除节点。对节点定义了类型,节点分为顶层节点、分组节点和图片节点,每个节点还存储一个用户数据,图片节点存储完整的图片文件名,以便点击节点时显示该图片
(2)QDockWidget 停靠组件。QDockWidget是可以在窗口是停靠或在桌面最上层浮动的组件,本示例会将一个树形组件放置在一个停靠组件上,设置可以在窗口的左侧或右侧停靠,也可以浮动
(3)QLabel 标签组件,窗口右侧是一个QScrollArea组件,在它上面放置一个标签,为标签设置一个QPixmap对象显示图片,通过QPixm的接口函数可以就行图片的缩放,
窗口界面可视化设计
如图1-1所示左侧放置一个QDockWidget组件,然后在QDockWIdget中放置一个QTreeWidget组件,并布局,右侧放置一个QScrollArea组件,然后在里面放置一个标签,并布局,利用label的pixmap属性来显示图片,当label显示的图片大小超过QScrollArea可显示区域的大小后,QScrollArea会自动显示水平或垂直方向的卷滚条,来用于移动显示区域。
QDockWIdget的属性
主要属性的含义如下。
(1)floating 属性,停靠区的组件是否处于浮动状态。通过函数isFloating()可以返回此属性值,函数setFloating(bool)可以设置此属性值。
(2)feature 属性,停靠区组件的特性。函数setFeatures()用于设置此属性值(是否可以停靠,是否可以浮动之类的),其函数原型定义为void QDockWIdget::setFeatures(QDockWidget::DockWidgetFeatures features)
(3)allowedAreas 属性:允许停靠的区域,函数setAllowedAreas()用于设置这个属性值,其函数原型为 void QDockWIdget::setAllowedAreas(Qt::DockWidgetAreas areas) 参数areas是枚举类型,可以组合使用
(4)windowTitle 属性:设置停靠窗口的标题。
QTreeWidget组件的可视化设计
QTreeWidget树形结构中一行是一个节点,一行可以有很多列,双击QTreeWidget会出现组件的编辑器,Columns页面用于设计树形组件的列,items页面用于设计树形组件的节点,一般树形组件的节点是动态创建的
设计Action
如图1-2所示

创建好所有Action后把它们都放置到工具栏和菜单栏中
QTreeWidget类
一个QTreeWidget组件显示分为表头和目录树结两个部分,表头和目录树都是QTreeWidgetItem对象。
(1)表头:树形组件有表头,表头可以是简单的文
字,也可以使用QTreeWidgetItem对象作为表头,这样的话可以设置表头每一列的文字,还可以设置字体,对齐方式,背景色,图标等特性如下图
通过使用函数setHeaderItem()设置表头,还可以通过函数headerItem()返回表头的QTreeWidgetItem对象指针。如果只是简单设置表头文字,就可以使用setHeaderLabels()将字符串列表内容作为表头各列标题。
(2) 顶层节点:目录树的一行就是一个节点,节点是QTreeWidgetItem对象,节点可以有子节点,子节点就是下一级节点,子节点可以继续有其子节点,可以层层嵌套。目录树的最上层节点就是顶层节点,顶层节点没有父节点,目录树可以有多个顶层节点,QTreeWidget类中有如下一些用于顶层节点的操作的接口函数。
int topLevelItemCount() //返回顶层节点个数
void addTopLevelItem(QTreeWidgetItem * Item) //添加一个顶层节点
void insert--------------- //插入一个顶层节点
int index--------------- //返回一个顶层节点的索引号
QTreeWidgetItem* topLevelItem(int index) //根据索引返回一个顶层节点
QTreeWidgetItem* takeTopLevelItem(int index)//移除一个顶层节点,但是并不删除这个节点对象
获取到顶层节点后可以访问它的所有子节点。
(3)次级节点,所有次级节点都是直接或间接挂靠在某个顶层节点下面,顶层节点和次级节点都是QTreeWidgetItem对象
(4)隐藏的根节点:目录树中还有一个隐藏的根节点,其可以看做所有顶层节点的父节点,通过函数invisibleRootItem() 可以返回这个隐藏的根节点,通过这个根节点可以访问所有的顶层节点
除了以上函数接口QTreeWidget还有一些其他采用的接口函数
(1)int columnCount() //返回表头列数
(2)void setColumnCount(int columns) //设置表头列数
(3)void sortItems(int column,Qt::SortOrder order) //将目录树按照某一列排序
(4)int sortColumn() //返回用于排序的列的序号
(5) QTreeWidgetItem* currentItem() //返回当前节点
(6)QList<QTreeWidgetItem*> selectedItems() //返回选择的节点的列表
QTreeWidgetItem 类
QTreeWidget组件的表头和目录树节点都是QTreeWidgetItem对象,对目录树节点的操作主要通过QTreeWidgetItem的接口函数实现,QTreeWidgetItem没有父类,它只是用来存储节点的数据和各种属性,绘制目录树由QTreeWidget实现。
QTreeWidgetItem类的构造函数
(1)QTreeWidgetItem(int type=Type) type是一个自定义数据,可以通过成员函数type(),返回这个类型
(2)QTreeWidgetItem(const QStringList &strings ,int type=Type)
(3)QTreeWidgetItem(QTreeWidgetItem* parent,int type=Type) parent是父节点
(4)QTreeWidgetItem(QTreeWidget* parent,int type=Type)parent是树形组件,用于创建顶层节点
访问节点各列数据的接口函数
void setBackground(int column,const QBrush &brush) //设置背景色
void setForeground(int column,const QBrush &brush) //设置前景色
还有很多,设置文本,设置文本对齐方式,设置toolTip文字,等等
setData()可以将节点的某一列设置为用户数据,这个数据是不显示在界面上的
void setData(int column ,int role ,const QVariant &value)参数role是用户数据角色,可以使用常量Qt::UserRole定义第一个用户数据,使用1+Qt::UserRole定义第二个用户数据
QVariant data(int column int role)获取用户数据
对节点整体特性进行操作的接口函数
void setExpanded(bool expand)
bool Expanded() //使节点展开或折叠
void setDisabled(bool disabled)
bool Disabled() //设置是否禁用此节点
void setHidden(bool hide)
bool Hidden() //设置是否隐藏此节点
voidsetSelected(bool select)
bool Selected() //设置此节点是否被选中
注意创建节点时传递的Type,创建以后不能改变
还有一个函数setFlags()用于设置节点的一些特性
void setFlags(Qt::ItemFlags flags) //设置节点标志
Qt;;ItemFlags flags() //获取节点标志
操作子节点的接口函数
一个节点可以有任意多个子节点,可以添加,插入或移除子节点,这里的子节点指一个节点的直接子节点,用于操作子节点的接口函数主要有一下几个
void addChild(QTreeWidgetItem *child):添加一个子节点
QTreeWidgetItem *child(int index):根据序号返回一个子节点
int childCount():返回子节点的个数
int indexOfChild(QTreeWidgetItem *child):返回一个子节点的索引号
void insertChild(int index, QTreeWidgetItem *child):插入一个子节点
void removeChild(QTreeWidgetItem *child):移除一个子节点
QTreeWidgetItem *takeChild(int index):移除一个子节点,并返回这个节点的指针
注意removeChild()和takeChild()都是从目录树上移除一个子节点,但是这个节点对象没有被删除
父节点
在目录树中,除了顶层节点,其他节点都有一个父节点,用函数parent()可以返回父节点指针