QTreeView QAbstractTableModel QStyledItemDelegate 定制化树形表格(一)

一、效果图
在这里插入图片描述
二、代码构造思路
自定义treeitem类,封装树形表格每个单元格。重写QAbstractTableModel的虚函数实现对应的方法,关联数据源model与QTreeView视图,设置样式代理修改风格。
三、代码片段

#include "treeitem.h"
treeitem::treeitem(const QVector<QVariant> &itemdata, treeitem *parent)
{
    m_pParent = parent;
    m_ItemData = itemdata;
}

treeitem::~treeitem()
{
    qDeleteAll(m_ChildItems);
}

treeitem *treeitem::child(int row)
{
    return m_ChildItems.value(row);
}

int treeitem::childCount() const
{
    return m_ChildItems.count();
}

int treeitem::columnCount() const
{
    return m_ItemData.count();
}

QVariant treeitem::data(int column) const
{
    return m_ItemData.at(column);
}

treeitem *treeitem::Parent()
{
    return m_pParent;
}

int treeitem::row() const
{
    if(m_pParent)
        return m_pParent->m_ChildItems.indexOf(const_cast<treeitem*>(this));
    return 0;
}
bool treeitem::insertChildren(int position, int count, int columns)
{
    if (position < 0 || position > m_ChildItems.size())
        return false;

    for (int row = 0; row < count; ++row)
    {
        QVector<QVariant> data(columns);
        treeitem *item = new treeitem(data, this);
        m_ChildItems.insert(position, item);
    }

    return true;
}
bool treeitem::setData(int column, const QVariant &value)
{
    if (column < 0 || column >= m_ItemData.size())
        return false;

    m_ItemData[column] = value;
    return true;
}


#include "model.h"
model::model(QObject *par)
    :QAbstractTableModel(par)
{
    QVector<QVariant> itemData;
    itemData<<"";
    m_pRootItem = new treeitem(itemData);

    for(int i=0;i<3;i++)
    {
        m_pRootItem->insertChildren(i,1,m_pRootItem->columnCount());
        treeitem* pParentItem = m_pRootItem->child(i);
        pParentItem->setData(0,"root");
        for(int j=0;j<3;j++)
        {
            pParentItem->insertChildren(j,1,m_pRootItem->columnCount());
            treeitem* pChildItem = pParentItem->child(j);
            pChildItem->setData(0,"child");
        }
    }
}

model::~model()
{
    delete m_pRootItem;
}

int model::columnCount(const QModelIndex &parent) const
{
    if(parent.isValid())
        return static_cast<treeitem*>(parent.internalPointer())->columnCount();
    else
        return m_pRootItem->columnCount();
}

QVariant model::data(const QModelIndex &index, int role) const
{
    if(!index.isValid())
        return QVariant();

    treeitem* item = static_cast<treeitem*>(index.internalPointer());

    if(role == Qt::DisplayRole)
        return item->data(index.column());
    else
        return QVariant();
}

Qt::ItemFlags model::flags(const QModelIndex &index) const
{
    if(!index.isValid())
        return 0;

    return QAbstractItemModel::flags(index);
}

QVariant model::headerData(int section, int role,Qt::Orientation orientation) const
{
    if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
        return m_pRootItem->data(section);

    return QVariant();
}
QModelIndex model::index(int row, int column, const QModelIndex &parent) const
{
    if (!hasIndex(row, column, parent))
        return QModelIndex();

    treeitem *parentItem;

    if (!parent.isValid())
        parentItem = m_pRootItem;
    else
        parentItem = static_cast<treeitem*>(parent.internalPointer());

    treeitem *childItem = parentItem->child(row);
    if (childItem)
        return createIndex(row, column, childItem);
    else
        return QModelIndex();
}
QModelIndex model::parent(const QModelIndex &index) const
{
    if (!index.isValid())
        return QModelIndex();

    treeitem *childItem = static_cast<treeitem*>(index.internalPointer());
    treeitem *parentItem = childItem->Parent();

    if (parentItem == m_pRootItem)
        return QModelIndex();

    return createIndex(parentItem->row(), 0, parentItem);
}
int model::rowCount(const QModelIndex &parent) const
{
    treeitem *parentItem;
    if (parent.column() > 0)
        return 0;

    if (!parent.isValid())
        parentItem = m_pRootItem;
    else
        parentItem = static_cast<treeitem*>(parent.internalPointer());

    return parentItem->childCount();
}

四、结束语
欢迎各方多多指教
QQ:519096571
e-mail:[email protected]

发布了30 篇原创文章 · 获赞 1 · 访问量 1163

猜你喜欢

转载自blog.csdn.net/u010906468/article/details/102911367
今日推荐