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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QAbstractItemModel - moveRows(moveColumns) ?  (Прочитано 8907 раз)
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.031 секунд. Запросов: 18.