Имелось ввиду возможно ли сделать это в рамках концепции QAbstractItemModel – QAbstractItemView без использования затычек, а не возможно ли это вообще сделать. Либо это недостаток разработчиков QT, либо я чего-то не понимаю!!!
Проблему я обошел, смотрите часть кода ниже.
Но это некрасиво, не вписывается в концепцию.
Например, каждое стандартное View необходимо будет наследовать дабы работало с модернизорованным наследником QAbstractItemModel.
C++ (Qt)
// class TManagerView : public QTreeView
void TManagerView::dropEvent (QDropEvent* event) {
ManagerModel->setMoveMode(true);
QTreeView::dropEvent(event);
}
// class TManagerModel : public QAbstractItemModel
bool TManagerModel::insertRows(int row, int count, const QModelIndex &parent) {
if(MoveMode) {
if(parent.isValid()) {InsertRow = -parent.row();}
else {InsertRow = row;}
InsertCount = count;
return false;
}
if(count <= 0) {return false;}
if(parent.isValid()) {return false;}
beginInsertRows(QModelIndex(), row, row+count-1);
//...
//...
//...
endInsertRows();
return true;
}
bool TManagerModel::removeRows(int row, int count, const QModelIndex &parent) {
bool CanMoveMode = false;
if(MoveMode) {CanMoveMode = true; MoveMode = false;}
if(parent.isValid()) {return false;}
if(count <= 0) {return false;}
if(row < 0) {return false;}
if(row+count > ManagerList->count()) {return false;}
if(CanMoveMode) {
if(count != InsertCount) {return false;}
int ind1 = row;
int ind2;
if (InsertRow < 0) {ind2 = -InsertRow;}
else if(ind1 < InsertRow) {ind2 = InsertRow-1;}
else {ind2 = InsertRow;}
ManagerList->move(ind1, ind1+InsertCount, ind2);
QModelIndex ModelIndex1 = this->index(ind1, 0, QModelIndex());
QModelIndex ModelIndex2 = this->index(ind2, 0, QModelIndex());
if(ind1 < ind2) {emit dataChanged(ModelIndex1, ModelIndex2);}
else {emit dataChanged(ModelIndex2, ModelIndex1);}
return false;
}
beginRemoveRows(parent, row, row+count-1);
ManagerList->remove(row, row+count);
endRemoveRows();
return true;
}
bool TManagerModel::setData(const QModelIndex &index, const QVariant& value, int role) {
if (role == Qt::DisplayRole && MoveMode) {return false;} // !!!
//...
//...
//...
}
Qt::ItemFlags TManagerModel::flags(const QModelIndex &index) const {
if (!index.isValid()) {return Qt::ItemIsDropEnabled;}
return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled;
}