博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Qt学习之路(40): QTreeWidget
阅读量:5734 次
发布时间:2019-06-18

本文共 2834 字,大约阅读时间需要 9 分钟。

前段时间笔记本坏掉了,一直没有更新博客,现在终于修好了啊,还是来继续《Qt学习之路》这个系列吧!
 
接着前面的内容,今天要说的是另外一个item view class,QTreeWidget。顾名思义,这个类用来展示树型结构。同前面说的QListWidget类似,这个类需要同另外一个辅助类QTreeWidgetItem一同使用。不过,既然是提供方面的封装类,即便是看上去很复杂的树,在使用这个类的时候也是显得比较简单的。当不需要使用复杂的QTreeView的特性的时候,我们可以直接使用QTreeWidget代替。
 
下面来看代码。
 
treewidget.h
InBlock.gif#ifndef TREEWIDGET_H 

InBlock.gif#define TREEWIDGET_H 

InBlock.gif 

InBlock.gif#include <QtGui> 

InBlock.gif 

InBlock.gif
class TreeWidget : 
public QWidget 

InBlock.gif

InBlock.gif
public

InBlock.gif        TreeWidget(); 

InBlock.gif 

InBlock.gif
private

InBlock.gif        QTreeWidget *tree; 

InBlock.gif}; 

InBlock.gif 

InBlock.gif#endif 
// TREEWIDGET_H
 
treewidget.cpp
InBlock.gif#include 
"treewidget.h" 

InBlock.gif 

InBlock.gifTreeWidget::TreeWidget() 

InBlock.gif

InBlock.gif        tree = 
new QTreeWidget(
this); 

InBlock.gif        tree->setColumnCount(1); 

InBlock.gif        QTreeWidgetItem *root = 
new QTreeWidgetItem(tree, QStringList(QString(
"Root"))); 

InBlock.gif        QTreeWidgetItem *leaf = 
new QTreeWidgetItem(root, QStringList(QString(
"Leaf 1"))); 

InBlock.gif        root->addChild(leaf); 

InBlock.gif        QTreeWidgetItem *leaf2 = 
new QTreeWidgetItem(root, QStringList(QString(
"Leaf 1"))); 

InBlock.gif        leaf2->setCheckState(0, Qt::Checked); 

InBlock.gif        root->addChild(leaf2); 

InBlock.gif        QList<QTreeWidgetItem *> rootList; 

InBlock.gif        rootList << root; 

InBlock.gif        tree->insertTopLevelItems(0, rootList); 

InBlock.gif

 
首先,我们在构造函数里面创建了一个QTreeWidget的实例。然后我们调用setColumnCount()函数设定栏数。这个函数的效果我们以后再看。然后我们要向QTreeWidget添加QTreeWidgetItem。QTreeWidgetItem有九个重载的构造函数。我们在这里只是来看看其中的一个,其余的请自行查阅API文档。这个构造函数的签名如下:
 
InBlock.gifQTreeWidgetItem::QTreeWidgetItem ( QTreeWidget * parent, 
const QStringList & strings, 
int type = Type );
 
这里有3个参数,第一个参数用于指定这个item属于哪一个树;第二个参数是指定这个item显示的文字;第三个参数用于指定这个item的类型。Type有两个可行的取值:QTreeWidgetItem::Type和QTreeWidgetItem::UserType,由于我们并没有定义用户类型,所以只使用其默认值即可。这里你会奇怪,第二个参数为什么是一个QStringList类型的,而不是QString类型的?我们先不去管它,继续下面的代码。
 
后面我们又创建了一个QTreeWidgetItem,注意它的第一个参数不是QTreeWidget而是QTreeWidgetItem类型的,这就把它的父节点设置为前面我们定义的root了。然后我们使用了setCheckState()函数,让它变得可以选择,最后使用addChild()函数把它添加进来。
 
最后一步,我们创建了一个QList类型,前面的root添加进去,然后insert到top items。这里可以想象到,由于这个树组件可以由多个根组成(严格来说这已经不是树了,不过姑且还是叫树吧),所以我们传进来的是一个list。
 
好了,编译运行一下我们的代码吧!
 
 
样子同我们想象的基本一致,只是这个树的头上怎么会有一个1?还记得我们跳过去的那个函数吗?下面我们修改一下代码看看:
 
InBlock.gif#include 
"listwidget.h" 

InBlock.gif 

InBlock.gifTreeWidget::TreeWidget() 

InBlock.gif

InBlock.gif        tree = 
new QTreeWidget(
this); 

InBlock.gif        tree->setColumnCount(2); 

InBlock.gif        QStringList headers; 

InBlock.gif        headers << 
"Name" << 
"Number"

InBlock.gif        tree->setHeaderLabels(headers); 

InBlock.gif        QStringList rootTextList; 

InBlock.gif        rootTextList << 
"Root" << 
"0"

InBlock.gif        QTreeWidgetItem *root = 
new QTreeWidgetItem(tree, rootTextList); 

InBlock.gif        QStringList leafTextList; 

InBlock.gif        leafTextList << 
"Leaf 1" << 
"1"

InBlock.gif        QTreeWidgetItem *leaf = 
new QTreeWidgetItem(root, leafTextList); 

InBlock.gif        root->addChild(leaf); 

InBlock.gif        QStringList leaf2TextList; 

InBlock.gif        leaf2TextList << 
"Leaf 2" << 
"2"

InBlock.gif        QTreeWidgetItem *leaf2 = 
new QTreeWidgetItem(root, leaf2TextList); 

InBlock.gif        leaf2->setCheckState(0, Qt::Checked); 

InBlock.gif        root->addChild(leaf2); 

InBlock.gif        QList<QTreeWidgetItem *> rootList; 

InBlock.gif        rootList << root; 

InBlock.gif        tree->insertTopLevelItems(0, rootList); 

InBlock.gif}
 
我们把columnCount设为2,然后传入的QStringList对应的有2个元素。这样再来运行一下:
 
 
原来这个columnCount就是用于在列表中显示树的!这样,你就可以很容易的将树和列表结合在一起,从而实现类似Windows资源管理器的界面。当然,如果你不需要显示这个header,可以调用setHeaderHidden()函数将这个功能隐藏掉。
本文转自 FinderCheng 51CTO博客,原文链接:
http://blog.51cto.com/devbean/262296

转载地址:http://ttmwx.baihongyu.com/

你可能感兴趣的文章
分布式日志收集系统实践(视频教程)
查看>>
MDT 2013 从入门到精通之SQL Configure And Verify
查看>>
Google双因子认证python最好的实现
查看>>
案例研究 路由器到路由器EOMPLS---VLAN重写
查看>>
WinSrv 2003系统加固教程
查看>>
***第一天
查看>>
栈的两种实现方式
查看>>
凭啥Java的运行环境称虚拟机,Python的只能称解释器
查看>>
jdk1.8下载全集,包括windows和linux版本
查看>>
Zabbix使用手册-zabbix agent 类型所有key
查看>>
用命令优化数据库
查看>>
感谢51CTO
查看>>
F#初学笔记06
查看>>
利用Failovr Cluster的Hyper-v创建高可用虚拟机
查看>>
Windows Server 2016-管理站点复制(一)
查看>>
FileBeat6.4 快速上手
查看>>
Citrix VDI-in-a-Box 第五篇:Image创建篇
查看>>
BT5里sqlmap注入
查看>>
OutLook取消接收Lync呼叫日志邮件
查看>>
SANS:2013年度安全分析(日志管理)调查报告
查看>>