Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
|
dmsovetov |
4.12.2015, 23:12
Сообщение
#1
|
|
Новичок Группа: Новичок Сообщений: 9 Регистрация: 4.12.2015 Пользователь №: 4495 Спасибо сказали: 0 раз(а) Репутация: 0
|
Добрый день
Уже второй день мучаюсь с QFileSystemModel - застрял на обработке сигналов rowsMoved/rowsAboutToBeMoved (те что описаны в QAbstractItemModel). Они почему-то не приходят. Когда я в QTreeView перекидываю файлы/папки из одного места в другое, мне приходят сигналы о том, что сначала элемент был убран из модели, а потом добавлен. Мне это, к сожалению, не подходит, потому что вместе с файлами нужно перемещать автоматически еще и прикрепленную мета-информацию. Вот настройка моего наследника QTreeView QFileSystemModel стандартный. Заранее спасибо |
|
|
|
|
Алексей1153 |
8.12.2015, 9:53
Сообщение
#2
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
dmsovetov, не так давно боролся с деревьями - была подобная проблема при перетаскивании (у меня три дерева рядом расположены, между всеми можно было элементы таскать). Сигналы удаления/добавления приручить так не удалось, поэтому решил задачу немного иначе - определяю попытку тащить элемент (ловлю в объекте-фильтре обработчики QEvent::MouseButtonPress, QEvent::MouseButtonRelease,QEvent::MouseMove) , создаю поверх всех деревьев прозрачное окно, где рисую текущее положение "подсвеченных" элементов и т.д. , там же определяю, куда бросили перетаскиваемое.
Возможно, всё решается и более изящно, но я не смог иначе решить |
|
|
|
|
dmsovetov |
8.12.2015, 11:11
Сообщение
#3
|
|
Новичок Группа: Новичок Сообщений: 9 Регистрация: 4.12.2015 Пользователь №: 4495 Спасибо сказали: 0 раз(а) Репутация: 0
|
Спасибо за ответ
|
|
|
|
|
Алексей1153 |
8.12.2015, 11:17
Сообщение
#4
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
dmsovetov, ага, мне тоже хотелось бы узнать. Но моё решение не такое уж плохое, как показала практика - весь код процесса перетаскивания и отрисовки дополнительной графики во время перетаскивания сосредоточен в одном классе - том самом окне, открываемом поверх
|
|
|
|
|
Iron Bug |
8.12.2015, 13:59
Сообщение
#5
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12
|
я не спец в Qt, но помню, что беглый поиск в гугле по этому вопросу выдавал пример реализации перегрузки методов Drag-n-drop для реализации такого функционала.
|
|
|
|
|
Алексей1153 |
8.12.2015, 15:07
Сообщение
#6
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
Iron Bug, я тоже находил, пробовал - чем-то меня тогда не устроило это (не вспомню, чем - скорее всего именно тем, что мувать требовалось между разными деревьями и что-то не мог срастить там). К слову, в окне, которое поверх, используется всё тот же QDrag::exec() , но работа происходит в пределах всего одного виджета (получается этакая ИЛС), при этом в самих деревьях никаких во время действия реально не производится изменений - юзер может перетащить элемент (вернее, иконку), бросить, прервать перетаскивание. "Источник" и "приёмник" элемента запоминаются, а вот о применении действия программа принимает решение уже после всего этого.
|
|
|
|
|
dmsovetov |
10.12.2015, 11:43
Сообщение
#7
|
|
Новичок Группа: Новичок Сообщений: 9 Регистрация: 4.12.2015 Пользователь №: 4495 Спасибо сказали: 0 раз(а) Репутация: 0
|
Цитата(Iron Bug @ 8.12.2015, 12:59) Link я не спец в Qt, но помню, что беглый поиск в гугле по этому вопросу выдавал пример реализации перегрузки методов Drag-n-drop для реализации такого функционала. Да, по всей видимости надо свой велосипед писать |
|
|
|
|
lanz |
11.12.2015, 11:24
Сообщение
#8
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8
|
Ну что значит велосипед. ОС насколько я понимаю не предоставляет сервиса слежения за перемещением файла:
Link Link Link Link Я не специалист по файловым системам, но то что я вижу - ни одна файловая система не поддерживает напрямую концепцию "перемещения" файла. Да и вообще сама концепция мутная. То что файл пропал из одной папки а появился в другой вовсе не значит что его туда переместили. Возможно это два несвязанных файла. Как быть например если удалился один файл а появились два одинаковых в разных местах? Дублировать метаинформацию? Для вашей задачи сопровождения метаданных я бы смотрел например Link Еще интересная ссылка: Link |
|
|
|
|
dmsovetov |
15.12.2015, 15:40
Сообщение
#9
|
|
Новичок Группа: Новичок Сообщений: 9 Регистрация: 4.12.2015 Пользователь №: 4495 Спасибо сказали: 0 раз(а) Репутация: 0
|
Цитата(lanz @ 11.12.2015, 10:24) Link ОС насколько я понимаю не предоставляет сервиса слежения за перемещением файла Да, я понимаю, просто надеялся, что хотя бы QFileSystemModel умеет фильтровать когда мы в QTreeView переместили файл, а когда удалили и создали новый |
|
|
|
|
lanz |
15.12.2015, 16:48
Сообщение
#10
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8
|
Цитата просто надеялся, что хотя бы QFileSystemModel умеет фильтровать Попробуйте посмотреть в dropMimeData, переопределить его, разобрать то что дропнуто. Вот: Link Там все очень просто сделано, и понятно как перегрузить. Сообщение отредактировал lanz - 15.12.2015, 16:52 |
|
|
|
![]() ![]() ![]() |
|
Текстовая версия | Сейчас: 24.12.2025, 16:15 |