Про QFileSystemModel

А вот возьмем, к примеру, Qt и решим вывести дерево фолдеров (папок, каталогов).

С незапамятных времен в Qt есть QDirModel, которая тянет данные синхронно и, поговаривают, очень от этого тормозит. Не заметил, чтобы очень, но на долю секунды при открытии большого каталога по сети - ну да, есть. Самое плохое в этом то, что оно блокирует UI пока читает каталоги, а пересадить в отдельный (от View) thread, судя по всему, не получится.

А есть новая прекрасная QFileSystemModel, которая все подтягивает асинхронно и сама мониторит изменения.

Казалось бы, надо пользоваться второй, новой и прекрасной, и горя не знать. Однако:

  • Она умеет мониторить только одно место за раз. Теоретически, она вот может мониторилку нацелить на My Computer и даже чувствовать изменения в списке дисков (во всяком случае, так задумано), практически - на Windows 7 это точно не работает (а на маке, если нацелиться на /Volumes - работает, кстати).
    Из практических упражнений видно, что пользователю удобно видеть в реалтайме изменения в том каталоге, где он сейчас работает (ну, к примеру, туда льются фоточки с флешки) и, кроме этого, на все уровни вверх (ну и можно добавить все раскрытые каталоги).
  • Соответственно, нужны отдельные мониторилки
    • Списка живых дисков (что мы весело обсуждали в прошлом посте)
    • Ну и какого-то небольшого списка каталогов.
  • Ничего сложного, QFileSystemWatcher все это умеет и сообщит если что изменилось.
  • ТОЛЬКО ЧТО С ЭТИМ ДЕЛАТЬ ДАЛЬШЕ: у старой QDirModel был вызов refresh(), который означал "выброси кэш от этого узла и дальше вниз". У новой, асинхронной, ничего такого нет, а все места, где можно было бы внешний прибор прикрутить - запрятаны в приватный интерфейс. Либо удалить модель и пересоздать, выкинув все кэши, либо же - пользоваться этим нельзя (для диалога выбора файла разово - можно, а в постоянном окне - нет).

Вот так старое и закоснелое не дает дорогу молодому и прекрасному.

Comments

Так вроде ничего сложного не составит расширить модель, унаследовав от нее все что нужно. Дальше используйте protected методы и поля сколько влезет. И так варите все что душе угодно :))

Конечно хочется чтобы оно все само умело из коробки. Но для этого нужно чтобы те, кому это интересно, делали соответствующий pull request в библиотеку. Или, хотя бы на крайняк, публиковали свои достижения на github/bitbucket.

Э, там не protected, так я умею.

Там все интересные потроха в QFileSystemPrivate (не уверен в названии, пишу по памяти, но суть передал) к которой порожденные классы не имеют доступа.