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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QFileSystemModel и сигнал о перемещении файла  (Прочитано 5864 раз)
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 стандартный. Заранее спасибо Улыбающийся
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Декабрь 06, 2015, 16:43 »

так перемещение ж = копирование + удаление. или при копировании и удалении мета-информация не трогается?

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
dmsovetov
Гость
« Ответ #2 : Декабрь 07, 2015, 14:32 »

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

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

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

UPD: добавил тестовый проект в аттаче, где слот rowsRemovedSlot срабатывает, а rowsMovedSlot - нет.
« Последнее редактирование: Декабрь 07, 2015, 14:58 от dmsovetov » Записан
popper
Гость
« Ответ #3 : Декабрь 08, 2015, 11:31 »

Судя по исходникам, QFileSystemModel испускает только сигнал
QAbstractItemModel::dataChanged.
Видимо, как-то нужно на основании этой информации определять перемещение файлов внутри вьюхи
Записан
Bepec
Гость
« Ответ #4 : Декабрь 08, 2015, 13:04 »

Эти сигналы приватные для модели.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Декабрь 08, 2015, 17:27 »

Эти сигналы приватные для модели.
Непонимающий
Записан

Qt 5.11/4.8.7 (X11/Win)
Bepec
Гость
« Ответ #6 : Декабрь 08, 2015, 19:54 »

rowsMoved вызываются из модели и цепляются к view. По сути они испускаются когда МОДЕЛЬ перемещает строки.

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

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

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



« Последнее редактирование: Декабрь 08, 2015, 19:57 от Bepec » Записан
dmsovetov
Гость
« Ответ #7 : Декабрь 10, 2015, 11:46 »

По всей видимости, надо либо dropMimeData переопределять в наследнике, либо вобще свое писать. Эх, а так хотелось чтоб все само работало  Грустный
Всем спасибо за ответы Улыбающийся
Записан
Bepec
Гость
« Ответ #8 : Декабрь 10, 2015, 14:04 »

Не вижу проблемы. У вас моделька должна данные хранить в себе, а не в гипотетическом "псевдофайле". Запихайте данные в модель и будет работать само.
А так получается, что вы к механизму пристроили свой велосипед и сетуете, что ж не едет Веселый
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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