Russian Qt Forum

Qt => Model-View (MV) => Тема начата: dmsovetov от Декабрь 04, 2015, 23:11



Название: QFileSystemModel и сигнал о перемещении файла
Отправлено: dmsovetov от Декабрь 04, 2015, 23:11
Добрый день :)

Уже второй день мучаюсь с QFileSystemModel - застрял на обработке сигналов rowsMoved/rowsAboutToBeMoved (те что описаны в QAbstractItemModel). Они почему-то не приходят. >:(

Когда я в QTreeView перекидываю файлы/папки из одного места в другое, мне приходят сигналы о том, что сначала элемент был убран из модели, а потом добавлен. Мне это, к сожалению, не подходит, потому что вместе с файлами нужно перемещать автоматически еще и прикрепленную мета-информацию.

Вот настройка моего наследника QTreeView
Код:
setModel( m_model );
setRootIndex( m_model->index( m_model->rootPath() ) );
setHeaderHidden( true );
setDragEnabled( true );
setDropIndicatorShown( true );
setDragDropOverwriteMode( true );
setSelectionMode( ExtendedSelection );
setDragDropMode( InternalMove );
setEditTriggers( EditTrigger::EditKeyPressed );
viewport()->setAcceptDrops( true );

QFileSystemModel стандартный. Заранее спасибо :)


Название: Re: QFileSystemModel и сигнал о перемещении файла
Отправлено: kambala от Декабрь 06, 2015, 16:43
так перемещение ж = копирование + удаление. или при копировании и удалении мета-информация не трогается?

а те сигналы вроде срабатывают только при перемещении строчек внутри вью.


Название: Re: QFileSystemModel и сигнал о перемещении файла
Отправлено: dmsovetov от Декабрь 07, 2015, 14:32
а те сигналы вроде срабатывают только при перемещении строчек внутри вью.
ну вобщем-то проблема как раз в том, что я внутри вью перемещаю, а сигналов нет... по крайней мере от модели.

так перемещение ж = копирование + удаление. или при копировании и удалении мета-информация не трогается?
Cуть в том, что с каждым файлом ассоциирован уникальный идентификатор (12-байтный UUID) + доп. инфа, все это хранится в отдельном файле в виде JSON.

Удаление через вью работает и мета-информация (это отдельный файл который я по сигналу убиваю) удаляется.
Копирование из вью не предусмотрено поэтому на него пофиг :)
С перемещением во вью беда: когда я в дереве вьюхи файлики по папкам двигаю, сигналы о перемещении не приходят, а вместо этого получаю сигналы об удалении и создании нового файла :( А мне ну очень надо именно перемещение, чтоб можно было сохранить UUID и переместить файл мета-информации.

UPD: добавил тестовый проект в аттаче, где слот rowsRemovedSlot срабатывает, а rowsMovedSlot - нет.


Название: Re: QFileSystemModel и сигнал о перемещении файла
Отправлено: popper от Декабрь 08, 2015, 11:31
Судя по исходникам, QFileSystemModel испускает только сигнал
QAbstractItemModel::dataChanged.
Видимо, как-то нужно на основании этой информации определять перемещение файлов внутри вьюхи


Название: Re: QFileSystemModel и сигнал о перемещении файла
Отправлено: Bepec от Декабрь 08, 2015, 13:04
Эти сигналы приватные для модели.


Название: Re: QFileSystemModel и сигнал о перемещении файла
Отправлено: GreatSnake от Декабрь 08, 2015, 17:27
Эти сигналы приватные для модели.
???


Название: Re: QFileSystemModel и сигнал о перемещении файла
Отправлено: Bepec от Декабрь 08, 2015, 19:54
rowsMoved вызываются из модели и цепляются к view. По сути они испускаются когда МОДЕЛЬ перемещает строки.

Как правильно написал kambala, в данном случае у вас View совершает копирование  и удаление строк из модели.

На мой взгляд у вас выход при "удалении и создании" проверять наличие уида и уже постфактум определять, было ли это перемещение или удаление.

PS по сути это сигнал извещающий view об изменениях в модели. Так же как и dataChanged. Как бы ещё проще отписать - это приватные технические сигналы, обеспечивающие работу model-view.





Название: Re: QFileSystemModel и сигнал о перемещении файла
Отправлено: dmsovetov от Декабрь 10, 2015, 11:46
По всей видимости, надо либо dropMimeData переопределять в наследнике, либо вобще свое писать. Эх, а так хотелось чтоб все само работало  :(
Всем спасибо за ответы :)


Название: Re: QFileSystemModel и сигнал о перемещении файла
Отправлено: Bepec от Декабрь 10, 2015, 14:04
Не вижу проблемы. У вас моделька должна данные хранить в себе, а не в гипотетическом "псевдофайле". Запихайте данные в модель и будет работать само.
А так получается, что вы к механизму пристроили свой велосипед и сетуете, что ж не едет :D