QTreeView顾名思义是树形结构,分级目录。直接上代码吧。
首先是Item的定义,item的定义有点像链表,记录父节点和子节点,功能大概就是获取子节点数,获取父节点,子节点,增加子节点,获取数据等。
class TreeItem { public: TreeItem(QList<QVariant> data,TreeItem *parentItem = 0); int childCount(); int columnCount(); void appendChild(TreeItem *childItem); QVariant data(int column); TreeItem *parentItem(); TreeItem *childItem(int row); int row(); private: TreeItem *m_parentItem; QList<TreeItem *> m_childItem; QList<QVariant> m_valueData; }; |
#include "treeitem.h" TreeItem::TreeItem(QList<QVariant> data,TreeItem *parentItem) { m_parentItem = parentItem; m_valueData = data; } int TreeItem::childCount() { return m_childItem.count(); } int TreeItem::columnCount() { return m_valueData.count(); } void TreeItem::appendChild(TreeItem *childItem) { m_childItem.append(childItem); } QVariant TreeItem::data(int column) { return m_valueData.value(column); } TreeItem * TreeItem::parentItem() { return m_parentItem; } TreeItem *TreeItem::childItem(int row) { return m_childItem.value(row); } int TreeItem::row() { if(m_parentItem) return m_parentItem->m_childItem.indexOf(const_cast<TreeItem *>(this)); return 0; } |
model继承QAbstractItemModel,
#include <QAbstractItemModel> #include "treeitem.h" class TreeModel : public QAbstractItemModel { public: TreeModel(); int columnCount(const QModelIndex &parent) const; QVariant data(const QModelIndex &index, int role) const; QModelIndex index(int row, int column, const QModelIndex &parent) const; QModelIndex parent(const QModelIndex &child) const; int rowCount(const QModelIndex &parent) const; QVariant headerData(int section, Qt::Orientation orientation, int role) const; void initModel(); public: TreeItem *m_rootItem; }; |
#include "treemodel.h" #include <QDebug> #include <QIcon> TreeModel::TreeModel() { QList<QVariant> rootdata; rootdata << "Title"; m_rootItem = new TreeItem(rootdata); } int TreeModel::columnCount(const QModelIndex &parent) const { if(parent.isValid()) { return static_cast<TreeItem *>(parent.internalPointer())->columnCount(); } return m_rootItem->columnCount(); } QVariant TreeModel::data(const QModelIndex &index, int role) const { if(!index.isValid()) return QVariant(); if(role == Qt::DecorationRole && index.column()==0) { return QIcon("1.png"); } if(role != Qt::DisplayRole) return QVariant(); TreeItem *item = static_cast<TreeItem *>(index.internalPointer()); return item->data(index.column()); } QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent) const { if(!hasIndex(row,column,parent)) return QModelIndex(); TreeItem *parentItem; if(!parent.isValid()) parentItem = m_rootItem; else parentItem = static_cast<TreeItem *>(parent.internalPointer()); TreeItem *childItem = parentItem->childItem(row); if(childItem) return createIndex(row,column,childItem); else return QModelIndex(); } QModelIndex TreeModel::parent(const QModelIndex &child) const { if(!child.isValid()) return QModelIndex(); TreeItem *childItem = static_cast<TreeItem *>(child.internalPointer()); TreeItem *parentItem = childItem->parentItem(); if(parentItem == m_rootItem) return QModelIndex(); return createIndex(parentItem->row(),0,parentItem); } int TreeModel::rowCount(const QModelIndex &parent) const { TreeItem *parentItem; if(!parent.isValid()) parentItem = m_rootItem; else parentItem = static_cast<TreeItem *>(parent.internalPointer()); return parentItem->childCount(); } QVariant TreeModel::headerData(int section, Qt::Orientation orientation, int role) const { if (orientation == Qt::Horizontal && role == Qt::DisplayRole) return m_rootItem->data(section); return QVariant(); } void TreeModel::initModel() { QStringList sList; sList << "1111" << "2222" << "3333" << "4444" << "5555"; QStringList ssList; ssList << "AAAA" << "BBBB" << "CCCC" << "DDDD" << "EEEE"; for(int i = 0; i < 5; i++) { QList<QVariant> data; data << sList.at(i); TreeItem *item = new TreeItem(data, m_rootItem); for(int j = 0; j < 5; j++) { QList<QVariant> data1; data1 << ssList.at(i); TreeItem *item1 = new TreeItem(data1, item); item->appendChild(item1); } m_rootItem->appendChild(item); } } |
QTreeView
view = new QTreeView(this); view->setFixedSize(640,480); TreeModel *model = new TreeModel; model->initModel(); view->setModel(model); view->show(); |