一、效果图
二、代码构造思路
自定义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]