Russian Qt Forum

Qt => Model-View (MV) => Тема начата: spectre71 от Май 01, 2009, 21:43



Название: QAbstractItemModel - moveRows(moveColumns) ?
Отправлено: spectre71 от Май 01, 2009, 21:43
Вопрос такой:
Как сделать премещение объектов источника данных без их удаления с последующей вставкой.
Возможно ли это вообще в рамках QAbstractItemModel?


Название: Re: QAbstractItemModel - moveRows(moveColumns) ?
Отправлено: ритт от Май 01, 2009, 22:15
QSortFilterProxyModel ?


Название: Re: QAbstractItemModel - moveRows(moveColumns) ?
Отправлено: spectre71 от Май 01, 2009, 22:47
QSortFilterProxyModel ?
Видимо я, не совсем ясно задал вопрос.

Имеем:
1) QTreeView для визуализации
2) Включены
  setDragEnabled(true);
  setAcceptDrops(true);
  setDropIndicatorShown(true);
  setDragDropMode(QAbstractItemView::InternalMove);
  setMovement(Free);

  в модели соответственно флаги итд.
3) Источник данных для модели - список некоторых объектов
  QTreeView каждая запись(строка) соответствует объекту списка (порядок как и в списке).
  По колонкам отображаются его некоторые характеристики.

Задача:
1)   Реализовать Drag and Drop записей через QTreeView при этом соответственно перемещаются объекты источника (список поддерживает перемещение)
2)   Удаление записи(объекта) через removeRows модели !!!
3)   Редактирование некоторых характеристик объекта через делегаты.
4)   Реализация Drag and Drop не должна каким-либо образом удалять объект из источника!!!
   




Название: Re: QAbstractItemModel - moveRows(moveColumns) ?
Отправлено: ритт от Май 02, 2009, 00:13
советую удаление данных из источника вынести в нестандартный метод, а в стандартном (removeRows()) реализовать лишь удаление строк модели.


Название: Re: QAbstractItemModel - moveRows(moveColumns) ?
Отправлено: spectre71 от Май 02, 2009, 08:11
Имелось ввиду возможно ли сделать это в рамках концепции 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;
}
 


Название: Re: QAbstractItemModel - moveRows(moveColumns) ?
Отправлено: spectre71 от Май 05, 2009, 07:50
Все молчат.
Неужели никто не знает ответ.


Название: Re: QAbstractItemModel - moveRows(moveColumns) ?
Отправлено: ритт от Май 05, 2009, 11:56
> советую удаление данных из источника вынести в нестандартный метод, а в стандартном (removeRows()) реализовать лишь удаление строк модели.

нет, слепим велосипед, объедем на нём "проблему" и будем теперь спрашивать то же самое про QAbstractItemView.
что мешало последовать совету? теперь геморройся самостоятельно.
в QAbstractItemView где-то видишь добавление/удаление строк?