QTreeView model/View

来源:互联网 发布:北京网络 编辑:程序博客网 时间:2024/06/06 13:08

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();