Про QFileSystemModel
lexa - 03/Апр/2015 21:56
А вот возьмем, к примеру, Qt и решим вывести дерево фолдеров (папок, каталогов).
С незапамятных времен в Qt есть QDirModel, которая тянет данные синхронно и, поговаривают, очень от этого тормозит. Не заметил, чтобы очень, но на долю секунды при открытии большого каталога по сети - ну да, есть. Самое плохое в этом то, что оно блокирует UI пока читает каталоги, а пересадить в отдельный (от View) thread, судя по всему, не получится.
А есть новая прекрасная QFileSystemModel, которая все подтягивает асинхронно и сама мониторит изменения.
Казалось бы, надо пользоваться второй, новой и прекрасной, и горя не знать. Однако:
- Она умеет мониторить только одно место за раз. Теоретически, она вот может мониторилку нацелить на My Computer и даже чувствовать изменения в списке дисков (во всяком случае, так задумано), практически - на Windows 7 это точно не работает (а на маке, если нацелиться на /Volumes - работает, кстати).
Из практических упражнений видно, что пользователю удобно видеть в реалтайме изменения в том каталоге, где он сейчас работает (ну, к примеру, туда льются фоточки с флешки) и, кроме этого, на все уровни вверх (ну и можно добавить все раскрытые каталоги). - Соответственно, нужны отдельные мониторилки
- Списка живых дисков (что мы весело обсуждали в прошлом посте)
- Ну и какого-то небольшого списка каталогов.
- Ничего сложного, QFileSystemWatcher все это умеет и сообщит если что изменилось.
- ТОЛЬКО ЧТО С ЭТИМ ДЕЛАТЬ ДАЛЬШЕ: у старой QDirModel был вызов refresh(), который означал "выброси кэш от этого узла и дальше вниз". У новой, асинхронной, ничего такого нет, а все места, где можно было бы внешний прибор прикрутить - запрятаны в приватный интерфейс. Либо удалить модель и пересоздать, выкинув все кэши, либо же - пользоваться этим нельзя (для диалога выбора файла разово - можно, а в постоянном окне - нет).
Вот так старое и закоснелое не дает дорогу молодому и прекрасному.
Comments
Так вроде ничего сложного не
Так вроде ничего сложного не составит расширить модель, унаследовав от нее все что нужно. Дальше используйте protected методы и поля сколько влезет. И так варите все что душе угодно :))
Конечно хочется чтобы оно все само умело из коробки. Но для этого нужно чтобы те, кому это интересно, делали соответствующий pull request в библиотеку. Или, хотя бы на крайняк, публиковали свои достижения на github/bitbucket.
Э, там не protected, так я
Э, там не protected, так я умею.
Там все интересные потроха в QFileSystemPrivate (не уверен в названии, пишу по памяти, но суть передал) к которой порожденные классы не имеют доступа.