#include "TreeModel.h"
#include <QDebug>
#include <qmimedata.h>
#include <qdatastream.h>
TreeModel::TreeModel(QObject *parent)
: QAbstractItemModel(parent)
{
m_pRootItem = new TreeItem(QString("root"), nullptr);
}
TreeModel::~TreeModel()
{
}
void TreeModel::createdata()
{
for (int i = 0; i < 10; i++)
{
beginInsertRows(QModelIndex(), i, i);
TreeItem* item = new TreeItem(QString::number(i), m_pRootItem);
endInsertRows();
}
}
void TreeModel::DeleteData()
{
for (int i = 9; i >= 0; i--)
{
beginRemoveRows(QModelIndex(), i, i);
m_pRootItem->RemoveItem(i);
endRemoveRows();
}
}
QModelIndex TreeModel::index(int row, int column, const QModelIndex & parent) const
{
if (!hasIndex(row, column, parent))
return QModelIndex();
TreeItem* parentItem = 0;
if (!parent.isValid())
parentItem = m_pRootItem;
else
parentItem = static_cast<TreeItem*>(parent.internalPointer());
TreeItem* item = parentItem->Child(row);
if (item == nullptr)
return QModelIndex();
return createIndex(row, column, item);
}
QModelIndex TreeModel::parent(const QModelIndex & child) const
{
if (!child.isValid())
return QModelIndex();
TreeItem* item = static_cast<TreeItem*>(child.internalPointer());
if (item->ParentItem() == nullptr)
return QModelIndex();
if (item->ParentItem() == m_pRootItem)
return createIndex(0,0,m_pRootItem);
return createIndex(item->ParentItem()->row(),0,item->ParentItem());
}
int TreeModel::rowCount(const QModelIndex & parent) const
{
if (!parent.isValid())
{
return m_pRootItem->childRows();
}
TreeItem* item = static_cast<TreeItem*>(parent.internalPointer());
return item->childRows();
}
int TreeModel::columnCount(const QModelIndex & parent) const
{
Q_UNUSED(parent);
return 1;
}
QVariant TreeModel::data(const QModelIndex & index, int role) const
{
if(!index.isValid())
return QVariant();
if (role == Qt::DisplayRole)
return static_cast<TreeItem*>(index.internalPointer())->data(role);
return QVariant();
}
bool TreeModel::dropMimeData(const QMimeData * data, Qt::DropAction action, int row, int column, const QModelIndex & parent)
{
QByteArray array = data->data(QString("hehe"));
QDataStream stream(&array, QIODevice::ReadOnly);
qint64 p;
stream >> p;
QModelIndex* index = (QModelIndex*)p;
TreeItem* item = static_cast<TreeItem*>(index->internalPointer());
TreeItem* ParentItem = static_cast<TreeItem*>(parent.internalPointer());
beginMoveRows(index->parent(), index->row(), index->row(), parent, ParentItem->childRows());
item->ParentItem()->RemoveItem(item->row());
ParentItem->AddChild(item);
endMoveRows();
delete index;
return false;
}
Qt::DropActions TreeModel::supportedDropActions() const
{
return Qt::MoveAction;
}
QMimeData * TreeModel::mimeData(const QModelIndexList & indexes) const
{
QMimeData* mimeData = QAbstractItemModel::mimeData(indexes);
//只取第一个
for (int i = 0; i < indexes.count(); i++)
{
QModelIndex index = indexes[i];
QModelIndex* p = new QModelIndex(index);
TreeItem* item = static_cast<TreeItem*>(index.internalPointer());
qDebug() << item->data(Qt::DisplayRole).toString();
QByteArray array;
QDataStream stream(&array, QIODevice::WriteOnly);
stream << (qint64)p;
mimeData->setData(QString("hehe"), array);
return mimeData;
}
return mimeData;
}
Qt::ItemFlags TreeModel::flags(const QModelIndex & index) const
{
if(index.isValid())
return QAbstractItemModel::flags(index) | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled;
else
return QAbstractItemModel::flags(index) | Qt::ItemIsDropEnabled;
}
评论1