bool TreeItem::move_up(void){ // Выясняется номер данного элемента в списке родителя int num=childNumber(); // Если двигать вверх некуда, ничего делать ненужно if(num==0)return false; // Элемент перемещается вверх по списку ( parentItem->childItems ).swap(num,num-1); return true;}
// Перемещение ветки вверхvoid knowtreemodel::move_up_branch(const QModelIndex &index){ // Получение QModelIndex расположенного над элементом index QModelIndex swap_index=index.sibling(index.row()-1,0); // Получение ссылки на Item элемент по QModelIndex TreeItem *current=getItem(index); // Элемент перемещается через метод move_up() if(current->move_up()) emit dataChanged(swap_index,index); // Данные на экране обновляются}
// Действия при клике на ветку дереваvoid treescreen::on_knowtree_clicked(const QModelIndex &index){ // Получаем указатель на текущую выбранную ветку дерева TreeItem *item = kntrmodel->getItem(index); qDebug() << "Name " << item->data(); ...}
// Получение указателя на Item-злемент связанный с заданным QModelIndexTreeItem *TreeModel::getItem(const QModelIndex &index) const{ if (index.isValid()) { TreeItem *item = static_cast<TreeItem*>(index.internalPointer()); if (item) return item; } return rootItem;}
if(current->move_up()) // Если перемещение в TreeItem представлении прошло нормально { changePersistentIndex(swap_index,index); emit dataChanged(swap_index,index); }
if(current->move_up()) // Если перемещение в TreeItem представлении прошло нормально { changePersistentIndex(swap_index,index); changePersistentIndex(index,swap_index); // <== emit dataChanged(swap_index,index); }
if ( willChangeTheModel ) { emit layoutAboutToBeChanged(); // code that moves data changePersistentIndex(swap_index,index); changePersistentIndex(index,swap_index); emit layoutChanged(); }
knowtree->selectionModel()->setCurrentIndex(index_after_move,QItemSelectionModel::ClearAndSelect);
knowtree->selectionModel()->select(index_after_move,QItemSelectionModel::ClearAndSelect);
void treescreen::move_up_branch(void){ // Если ветку нельзя перемещать if(!move_check_enable()) return; // Получение индекса выделенной строки QModelIndex index=get_current_item_index(); // Ветка перемещается QModelIndex index_after_move; index_after_move=kntrmodel->move_up_branch(index); // Установка курсора на позицию, куда была перенесена ветка if(index_after_move.isValid()) { knowtree->selectionModel()->setCurrentIndex(index_after_move,QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Current); knowtree->selectionModel()->select(index_after_move,QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Current); } }
// Перемещение ветки вверхQModelIndex knowtreemodel::move_up_branch(const QModelIndex &index){ // Получение QModelIndex расположенного над элементом index QModelIndex swap_index=index.sibling(index.row()-1,0); // Получение ссылки на Item элемент по QModelIndex TreeItem *current=getItem(index); // Перемещается ветка, и если она нормально переместилась if(current->move_up()) { emit layoutAboutToBeChanged(); changePersistentIndex(swap_index,index); changePersistentIndex(index,swap_index); emit layoutChanged(); // Возвращается указатель на перемещенную ветку return swap_index; } else return QModelIndex(); // Возвращается пустой указатель}
// Перемещение ветки вверхQModelIndex knowtreemodel::move_up_branch(const QModelIndex &index){ // Получение QModelIndex расположенного над элементом index QModelIndex swap_index=index.sibling(index.row()-1,0); <<<=== ЗДЕСЬ ИНДЕКС ЕЩЁ ВАЛИДНЫЙ // Получение ссылки на Item элемент по QModelIndex TreeItem *current=getItem(index); // Перемещается ветка, и если она нормально переместилась if(current->move_up()) { <<== А ЗДЕСЬ УЖЕ НЕТ emit layoutAboutToBeChanged(); changePersistentIndex(swap_index,index); changePersistentIndex(index,swap_index); emit layoutChanged(); // Возвращается указатель на перемещенную ветку // return swap_index; <<== МУСОР return index( swap_index.row(), swap_index.column(), swap_index.parent() ); <<== ЧЕРЕЗ ОДНО МЕСТО, ЗАТО КОРРЕКТНО } else return QModelIndex(); // Возвращается пустой указатель}
QModelIndex TreeModel::move_up_branch(const QModelIndex &index){ // Получение QModelIndex расположенного над элементом index QModelIndex swap_index=index.sibling(index.row()-1,0); int swpidx_row=swap_index.row(); int swpidx_column=swap_index.column(); QModelIndex swpidx_parent=swap_index.parent(); // Получение ссылки на Item элемент по QModelIndex TreeItem *current=getItem(index); // Перемещается ветка, и если она нормально переместилась if(current->move_up()) { emit layoutAboutToBeChanged(); changePersistentIndex(swap_index,index); changePersistentIndex(index,swap_index); emit layoutChanged(); // Возвращается указатель на перемещенную ветку QModelIndex retidx=index(swpidx_row, swpidx_column, swpidx_parent); // <--- Тут ошибка return retidx; } else return QModelIndex(); // Возвращается пустой указатель}