Реализация диалога файлов Qt с другой библиотекой файловой системы (ускорение)

Я пишу приложение, которое требует от меня использования другой файловой системы и обработчиков файловых движков, а не стандартных qt. По сути, я хочу иметь возможность использовать диалоговое окно файла qt, но иметь базовый обработчик файловой системы (например, созданный с использованием библиотеки файловой системы boost), который обрабатывает все операции, связанные с файлами и каталогами. операции в этом диалоге. Я уже написал собственный файловый механизм, который обрабатывает некоторые операции, но теперь я застрял с моделью файловой системы Qt и механизмом наблюдения за файловой системой, так как мне нужно передавать сигналы для этого пользовательского файлового механизма. Кажется, передо мной стоит непростая задача. Я иду в правильном направлении?

Есть ли другой более простой способ реализовать это? Может ли кто-нибудь дать мне представление о том, как действовать. Я думал изучить прокси-модели, но не уверен, что это сработает.

Заранее благодарю за любую помощь.


person knight    schedule 11.04.2010    source источник


Ответы (2)


Прокси-модель работает с данными, которые содержит базовая модель, поэтому вы не можете использовать ее для получения совершенно нового содержимого модели.

Очевидный способ выполнить такие задачи — выяснить, какая модель у QFileDialog, а затем заменить модель.

Вы можете, вероятно, скопировать модель из QFileDialog, применительно к вашему новому файловому движку, конечно, а затем использовать прокси-модель несколько странным образом: установить ее (она будет подключаться к базовой модели QFileDialog, вы не можете получить доступ другим способом), а затем используйте setSourceModel() вашего прокси, чтобы вместо этого установить свою модель.

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

person Maxim Popravko    schedule 12.04.2010
comment
Большое спасибо за ваш ответ, Макс, я думал в том же направлении, что вы упомянули, как получить код QFileDialog и изменить его, но это не кажется правильным из-за проблем с лицензированием и т. д. Кроме того, как вы предположили, прокси-модели не будут предоставить что-либо, так как некоторые вызовы, сделанные QDir, вызываются из QFileSystemModel. В этом случае единственным решением будет написать всю новую модель, а затем создать представление, подобное QFileDialog, что в лучшем случае нетривиально. - person knight; 13.04.2010
comment
Я чувствую, что должно быть более простое решение для этого. Возможно, мне придется предоставить некоторые функции Qdir и QFileEnginePrivate в свой собственный файловый механизм, и тогда, надеюсь, я все еще смогу использовать ту же пару модель-представление для доступа к файлам через свой собственный механизм. Я не совсем уверен, сработает ли то, о чем я думаю, или нет, и имеет ли это вообще смысл. - person knight; 13.04.2010
comment
Может быть, вам нужно переопределить только QFileSystemModel, а затем подключить вашу модель к QFileDialog, используя метод setSourceModel() прокси-модели? - person Maxim Popravko; 13.04.2010

Раньше это можно было сделать с помощью QAbstractFileEngine и т. д., но изменения в QDir в Qt 4.6 несколько нарушили его — см. ошибка Qt 10333 для моего опыта.

person Alphax    schedule 16.05.2010