Simple Tree Model
此介绍如何自定义TreeModel。一点都不Simple,值得多看几遍。
前置实例
- 无
运行结果
- 能够树形显示文件中的内容
实例位置
Qt_Offical_demo/widgets/itemviews/simpletreemodel
主要使用类
- QTreeView
- QAbstractItemModel
- QModelIndex
- QFile
- QVariant
类分析
本例代码我们从类与类的关系开始分析。
使用面向对象的方法,我们先来看类TreeItem
.
Class TreeItem
类TreeItem
是用来描述Model中的一个Item的。
treeitem.h
因为Tree的特殊性,我们来看一下头文件:
class TreeItem
{
public:
// ClassInfo 1
explicit TreeItem(const QList<QVariant> &data, TreeItem *parentItem = 0);
~TreeItem();
void appendChild(TreeItem *child);
TreeItem *child(int row);
int childCount() const;
int columnCount() const;
QVariant data(int column) const;
int row() const;
TreeItem *parentItem();
private:
//ClassInfo 2
QList<TreeItem*> m_childItems;
QList<QVariant> m_itemData;
TreeItem *m_parentItem;
};
ClassInfo 1:构造函数
需要使用一个QList,里面存储的内容的类型是QVariant,即为某种类型都可以。
ClassInfo2 :私有成员
私有成员代表了类的属性,通常是需要注意的。
treeitem.cpp
下面看一下CPP文件,注意一些细节。
构造函数:
TreeItem::TreeItem(const QList<QVariant> &data, TreeItem *parent)
{
m_parentItem = parent;
m_itemData = data;
}
没什么可说的。
析构函数:
TreeItem::~TreeItem()
{
qDeleteAll(m_childItems);
}
这里的m_childItems
是一个QList,里面存储的指针。qDeleteAll()
可以删除容器里面的item,前提是item的类型是一个指针。
延申:本类有三个成员:
QList<TreeItem*> m_childItems;
QList<QVariant> m_itemData;
TreeItem *m_parentItem;
为什么只需要delete一个呢?
m_itemData直接就是类对象,是在栈上创建的,本来就没有new,更不要说delete了。
m_parentItem虽然是一个类指针,但是并不是本类创建的,而是由构造函数传入的,因此不用delete。
总结:由你new的,才需要你去delete。
其他函数:
void TreeItem::appendChild(TreeItem *item)
{
m_childItems.append(item);
}
TreeItem *TreeItem::child(int row)
{
return m_childItems.value(row);
}
int TreeItem::childCount()