Russian Qt Forum
Ноябрь 24, 2024, 06:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QAbstractItemModel - moveRows(moveColumns) ?  (Прочитано 8712 раз)
spectre71
Гость
« : Май 01, 2009, 21:43 »

Вопрос такой:
Как сделать премещение объектов источника данных без их удаления с последующей вставкой.
Возможно ли это вообще в рамках QAbstractItemModel?
« Последнее редактирование: Май 01, 2009, 21:44 от spectre71 » Записан
ритт
Гость
« Ответ #1 : Май 01, 2009, 22:15 »

QSortFilterProxyModel ?
Записан
spectre71
Гость
« Ответ #2 : Май 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 не должна каким-либо образом удалять объект из источника!!!
   


Записан
ритт
Гость
« Ответ #3 : Май 02, 2009, 00:13 »

советую удаление данных из источника вынести в нестандартный метод, а в стандартном (removeRows()) реализовать лишь удаление строк модели.
Записан
spectre71
Гость
« Ответ #4 : Май 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;
}
 
Записан
spectre71
Гость
« Ответ #5 : Май 05, 2009, 07:50 »

Все молчат.
Неужели никто не знает ответ.
Записан
ритт
Гость
« Ответ #6 : Май 05, 2009, 11:56 »

> советую удаление данных из источника вынести в нестандартный метод, а в стандартном (removeRows()) реализовать лишь удаление строк модели.

нет, слепим велосипед, объедем на нём "проблему" и будем теперь спрашивать то же самое про QAbstractItemView.
что мешало последовать совету? теперь геморройся самостоятельно.
в QAbstractItemView где-то видишь добавление/удаление строк?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.095 секунд. Запросов: 21.