Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Zmeishe от Июнь 26, 2008, 11:31



Название: Как сменить parent для всех QModelIndex целой строки в QStandardItemModel ?
Отправлено: Zmeishe от Июнь 26, 2008, 11:31
Qt 4.3.3

Необходимо перенести одну ветку дерева со всеми потомками целиком в другую ветку дерева.
Есть какие-нибудь готовые функции Qt или самому рекурсию крутить ?


Название: Re: Как сменить parent для всех QModelIndex целой строки в QStandardItemModel ?
Отправлено: Karl-Philipp от Июнь 27, 2008, 14:05
а пробовали использовать
Цитировать
QStandardItem * QStandardItemModel::takeItem ( int row, int column = 0 )
?

По идее, указатели на дочерние айтемы должны сохраниться в айтеме, который берем.

ну а установить с помощью
Цитировать
void QStandardItem::setChild ( int row, int column, QStandardItem * item )


Название: Re: Как сменить parent для всех QModelIndex целой строки в QStandardItemModel ?
Отправлено: Zmeishe от Июнь 30, 2008, 11:51
Спасибо, terlan, навёл на мысль.

Вот окончательный вариант.
Одна тонкость - чтобы у вьюхи не было глюкавостей с перерисовкой, переносимую(вырезаемую) ветку надо свернуть, вызвав вьюхин слот collapse(const QModelIndex & index)
Код:
void MainWindowImpl::on_actionCut_triggered()
{
 QModelIndex idx = tree->model()->index(tree->currentIndex().row(), 0, tree->currentIndex().parent());
 tree->collapse(idx);
 item_cut = ((QStandardItemModel*) tree->model())->itemFromIndex(idx);
 item_cut->setIcon(QIcon(":/new/prefix1/images/mozilla-firebird.png")); // Какая-то иконка, чтобы видно было, что переносим
}

void MainWindowImpl::on_actionPaste_triggered()
{
 QModelIndex idx = tree->model()->index(tree->currentIndex().row(), 0, tree->currentIndex().parent());
 QStandardItem *new_parent_item = item_cut->model()->itemFromIndex(idx);
 QStandardItem *old_parent_item = item_cut->parent();   

 item_cut->setIcon(QIcon());
 QList<QStandardItem*> list = old_parent_item->takeRow(item_cut->row());
 new_parent_item->appendRow(list);
 item_cut = NULL;
}
Переносится вся ветка целиком со всеми вложениями, так как было задумано.