接着前面的内容,今天要说的是另外一个item view class,QTreeWidget。顾名思义,这个类用来展示树型结构。同前面说的QListWidget类似,这个类需要同另外一个辅助类 QTreeWidgetItem一同使用。不过,既然是提供方面的封装类,即便是看上去很复杂的树,在使用这个类的时候也是显得比较简单的。当不需要使用 复杂的QTreeView的特性的时候,我们可以直接使用QTreeWidget代替。
下面来看代码。
treewidget.h
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
#ifndef TREEWIDGET_H
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
#define TREEWIDGET_H
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
#include <QtGui>
class TreeWidget :
public QWidget
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
{
public :
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
TreeWidget();
private :
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
QTreeWidget *tree;
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
};
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
#endif
// TREEWIDGET_H
treewidget.cpp
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
#include
"treewidget.h"
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
TreeWidget::TreeWidget()
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
{
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
tree =
new QTreeWidget(
this );
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
tree->setColumnCount(1);
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
QTreeWidgetItem *root =
new QTreeWidgetItem(tree, QStringList(QString(
"Root" )));
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
QTreeWidgetItem *leaf =
new QTreeWidgetItem(root, QStringList(QString(
"Leaf 1" )));
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
root->addChild(leaf);
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
QTreeWidgetItem *leaf2 =
new QTreeWidgetItem(root, QStringList(QString(
"Leaf 1" )));
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
leaf2->setCheckState(0, Qt::Checked);
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
root->addChild(leaf2);
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
QList<QTreeWidgetItem *> rootList;
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
rootList << root;
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
tree->insertTopLevelItems(0, rootList);
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
}
首先,我们在构造函数里面创建了一个QTreeWidget的实例。然后我们调用setColumnCount()函数设定栏数。这个函数的效 果我们以后再看。然后我们要向QTreeWidget添加QTreeWidgetItem。QTreeWidgetItem有九个重载的构造函数。我们在 这里只是来看看其中的一个,其余的请自行查阅API文档。这个构造函数的签名如下:
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
QTreeWidgetItem::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?还记得我们跳过去的那个函数吗?下面我们修改一下代码看看:
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
#include
"listwidget.h"
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
TreeWidget::TreeWidget()
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
{
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
tree =
new QTreeWidget(
this );
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
tree->setColumnCount(2);
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
QStringList headers;
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
headers <<
"Name" <<
"Number" ;
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
tree->setHeaderLabels(headers);
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
QStringList rootTextList;
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
rootTextList <<
"Root" <<
"0" ;
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
QTreeWidgetItem *root =
new QTreeWidgetItem(tree, rootTextList);
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
QStringList leafTextList;
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
leafTextList <<
"Leaf 1" <<
"1" ;
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
QTreeWidgetItem *leaf =
new QTreeWidgetItem(root, leafTextList);
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
root->addChild(leaf);
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
QStringList leaf2TextList;
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
leaf2TextList <<
"Leaf 2" <<
"2" ;
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
QTreeWidgetItem *leaf2 =
new QTreeWidgetItem(root, leaf2TextList);
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
leaf2->setCheckState(0, Qt::Checked);
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
root->addChild(leaf2);
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
QList<QTreeWidgetItem *> rootList;
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
rootList << root;
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
tree->insertTopLevelItems(0, rootList);
![](http://img.e-com-net.com/image/info5/1c8d106bc23c40648c092a1e37dbbd15.gif)
}
我们把columnCount设为2,然后传入的QStringList对应的有2个元素。这样再来运行一下:
原来这个columnCount就是用于在列表中显示树的!这样,你就可以很容易的将树和列表结合在一起,从而实现类似Windows资源管理 器的界面。当然,如果你不需要显示这个header,可以调用setHeaderHidden()函数将这个功能隐藏掉。
本文出自 “豆子空间 ” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/262296