class CTreeView : public QAbstractItemModel
{
public:
CTreeView();
~CTreeView();
QVariant data(const QModelIndex& iIndex, int inRole)const;
QVariant headerData(int inSection, Qt::Orientation iOrientation, int inRole = Qt::DisplayRole)const;
QModelIndex index(int inRow, int inColumn, const QModelIndex& ipParent = QModelIndex())const;
QModelIndex parent(const QModelIndex& iIndex)const;
int rowCount(const QModelIndex& iParent = QModelIndex())const;
int columnCount(const QModelIndex &iParent = QModelIndex()) const;
bool setHeaderData ( int inSection, Qt::Orientation iOrientation, const QVariant & istlValue, int inRole = Qt::EditRole);
void setColumnCount(int inCount);
bool insertRow (int inRow, const QModelIndex & iParent = QModelIndex());
bool setData ( const QModelIndex & iIndex, const QVariant & istlValue, int inRole = Qt::EditRole );
void clear();
private:
CViewItem* mptypRootItem;
};
CTreeView::CTreeView()
{
mptypRootItem = new CViewItem();
}
CTreeView::~CTreeView()
{
delete mptypRootItem;
}
QModelIndex CTreeView::index(int inRow, int inColumn, const QModelIndex& iParent /* = QModelIndex */)const
{
CViewItem* lptypParentItem;
CViewItem * lptypChildItem;
if (!hasIndex(inRow, inColumn, iParent))
{
return QModelIndex();
}
if (!iParent.isValid())
{
lptypParentItem = mptypRootItem;
}
else
{
lptypParentItem = static_cast<CViewItem*>(iParent.internalPointer());
}
lptypChildItem = lptypParentItem->child(inRow);
if (lptypChildItem)
{
return createIndex(inRow, inColumn, lptypChildItem);
}
else
{
return QModelIndex();
}
}
QModelIndex CTreeView::parent(const QModelIndex& iIndex)const
{
CViewItem* lptypChildItem;
CViewItem* lptypParent;
if (!iIndex.isValid())
{
return QModelIndex();
}
lptypChildItem = static_cast<CViewItem*>(iIndex.internalPointer());
lptypParent = lptypChildItem->parent();
if (lptypParent == mptypRootItem)
{
return QModelIndex();
}
else
{
return createIndex(lptypParent->row(), 0, lptypParent);
}
}
int CTreeView::rowCount(const QModelIndex& iParent /* = QModelIndex */)const
{
CViewItem* lptypParentItem;
if (iParent.column() > 0)
{
return 0;
}
if (!iParent.isValid())
{
lptypParentItem = mptypRootItem;
}
else
{
lptypParentItem = static_cast<CViewItem*>(iParent.internalPointer());
}
return lptypParentItem->childCount();
}
int CTreeView::columnCount(const QModelIndex& iParent /* = QModelIndex */)const
{
if (iParent.isValid())
{
return static_cast<CViewItem*>(iParent.internalPointer())->columnCount();
}
else
{
return mptypRootItem->columnCount();
}
}
QVariant CTreeView::data(const QModelIndex& iIndex, int inRole)const
{
if (!iIndex.isValid())
{
return QVariant();
}
if (inRole != Qt::DisplayRole)
{
return QVariant();
}
CViewItem* lptypItem = static_cast<CViewItem*>(iIndex.internalPointer());
return lptypItem->data(iIndex.column());
}
QVariant CTreeView::headerData(int inSection, Qt::Orientation iOrientation, int inRole /* = QT::DisplayRole */)const
{
if (iOrientation == Qt::Horizontal && inRole == Qt::DisplayRole)
{
return mptypRootItem->data(inSection);
}
return QVariant();
}
void CTreeView::setColumnCount(int inCount)
{
if(inCount <= 0)
return;
mptypRootItem->cleanData();
for (int i = 0; i < inCount; ++i)
{
mptypRootItem->setData(i, QString("%1").arg(i));
}
headerDataChanged(Qt::Horizontal, 0, inCount - 1);
}
bool CTreeView::setHeaderData(int inSection, Qt::Orientation iOrientation, const QVariant & istlValue, int inRole /* = Qt::EditRole */)
{
if (true == mptypRootItem->setData(inSection, istlValue))
{
headerDataChanged(iOrientation, inSection, inSection);
return true;
}
else
{
return false;
}
}
bool CTreeView::insertRow(int inRow, const QModelIndex & iParent /* = QModelIndex */)
{
CViewItem* lptypParentItem;
CViewItem* lptypChild = new CViewItem();
if (!iParent.isValid())
{
lptypParentItem = mptypRootItem;
}
else
{
lptypParentItem = static_cast<CViewItem*>(iParent.internalPointer());
}
lptypChild->setParent(lptypParentItem);
if (true == lptypParentItem->insertChild(inRow, lptypChild))
{
return true;
}
else
{
return false;
}
}
bool CTreeView::setData(const QModelIndex & iIndex, const QVariant & istlValue, int inRole /* = Qt::EditRole */)
{
int lnColumn;
if(!iIndex.isValid())
return false;
CViewItem* lptypItem = static_cast<CViewItem*>(iIndex.internalPointer());
lnColumn = iIndex.column();
lptypItem->setData(lnColumn, istlValue, lptypItem->parent());
return true;
}
void CTreeView::clear()
{
mptypRootItem->eraseChild();
}
这就是我完整的model类了,虽然都没有注释,不过这些类都是重写的QAbstractItemModel的方法,请各位大侠多多指点!
谢谢!