Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Модель/Представление _ QFileSystemModel и сигнал о перемещении файла

Автор: dmsovetov 4.12.2015, 23:12

Добрый день :)

Уже второй день мучаюсь с 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 стандартный. Заранее спасибо :)

Автор: Алексей1153 8.12.2015, 9:53

dmsovetov, не так давно боролся с деревьями - была подобная проблема при перетаскивании (у меня три дерева рядом расположены, между всеми можно было элементы таскать). Сигналы удаления/добавления приручить так не удалось, поэтому решил задачу немного иначе - определяю попытку тащить элемент (ловлю в объекте-фильтре обработчики QEvent::MouseButtonPress, QEvent::MouseButtonRelease,QEvent::MouseMove) , создаю поверх всех деревьев прозрачное окно, где рисую текущее положение "подсвеченных" элементов и т.д. , там же определяю, куда бросили перетаскиваемое.

Возможно, всё решается и более изящно, но я не смог иначе решить :D

Автор: dmsovetov 8.12.2015, 11:11

Спасибо за ответ :) Я уже тоже думал всякое выдумывать: считать хеш файла и по нему искать старые мета-данные и цеплять их к "новому" файлу (который я переместил), но хотелось бы конечно узнать как это "по-нормальному" делается, наверняка есть какое-то решение.

Автор: Алексей1153 8.12.2015, 11:17

dmsovetov, ага, мне тоже хотелось бы узнать. Но моё решение не такое уж плохое, как показала практика - весь код процесса перетаскивания и отрисовки дополнительной графики во время перетаскивания сосредоточен в одном классе - том самом окне, открываемом поверх

Автор: Iron Bug 8.12.2015, 13:59

я не спец в Qt, но помню, что беглый поиск в гугле по этому вопросу выдавал пример реализации перегрузки методов Drag-n-drop для реализации такого функционала.

Автор: Алексей1153 8.12.2015, 15:07

Iron Bug, я тоже находил, пробовал - чем-то меня тогда не устроило это (не вспомню, чем - скорее всего именно тем, что мувать требовалось между разными деревьями и что-то не мог срастить там). К слову, в окне, которое поверх, используется всё тот же QDrag::exec() , но работа происходит в пределах всего одного виджета (получается этакая ИЛС), при этом в самих деревьях никаких во время действия реально не производится изменений - юзер может перетащить элемент (вернее, иконку), бросить, прервать перетаскивание. "Источник" и "приёмник" элемента запоминаются, а вот о применении действия программа принимает решение уже после всего этого.

Автор: dmsovetov 10.12.2015, 11:43

Цитата(Iron Bug @ 8.12.2015, 12:59) *
я не спец в Qt, но помню, что беглый поиск в гугле по этому вопросу выдавал пример реализации перегрузки методов Drag-n-drop для реализации такого функционала.

Да, по всей видимости надо свой велосипед писать :(

Автор: lanz 11.12.2015, 11:24

Ну что значит велосипед. ОС насколько я понимаю не предоставляет сервиса слежения за перемещением файла:
http://stackoverflow.com/questions/931093/how-do-i-make-my-program-watch-for-file-modification-in-c
http://doc.qt.io/qt-4.8/qfilesystemwatcher.html#fileChanged
https://en.wikipedia.org/wiki/Inotify
https://msdn.microsoft.com/en-us/library/windows/desktop/aa364417(v=vs.85).aspx

Я не специалист по файловым системам, но то что я вижу - ни одна файловая система не поддерживает напрямую концепцию "перемещения" файла.
Да и вообще сама концепция мутная. То что файл пропал из одной папки а появился в другой вовсе не значит что его туда переместили. Возможно это два несвязанных файла.
Как быть например если удалился один файл а появились два одинаковых в разных местах? Дублировать метаинформацию?

Для вашей задачи сопровождения метаданных я бы смотрел например
https://msdn.microsoft.com/en-us/library/windows/desktop/aa364404(v=vs.85).aspx


Еще интересная ссылка:
https://support.microsoft.com/en-us/kb/310316

Автор: dmsovetov 15.12.2015, 15:40

Цитата(lanz @ 11.12.2015, 10:24) *
ОС насколько я понимаю не предоставляет сервиса слежения за перемещением файла

Да, я понимаю, просто надеялся, что хотя бы QFileSystemModel умеет фильтровать когда мы в QTreeView переместили файл, а когда удалили и создали новый :).

Автор: lanz 15.12.2015, 16:48

Цитата
просто надеялся, что хотя бы QFileSystemModel умеет фильтровать


Попробуйте посмотреть в dropMimeData, переопределить его, разобрать то что дропнуто.

Вот:
https://github.com/qtproject/qtbase/blob/3b6aafe9a76cdf7260e03375a94034589af6d791/src/widgets/dialogs/qfilesystemmodel.cpp#L1192
Там все очень просто сделано, и понятно как перегрузить.

Автор: dmsovetov 15.12.2015, 17:02

Да, думаю это то, что мне нужно =)

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)