Я написал это на официальном форуме Qt, но он кажется мертвым, поэтому я скопирую его сюда.
Я пишу небольшую программу для копирования файлов. Я использую QTreeView и унаследовал от QFileSystemModel, поэтому я смог добавить флажки в каждую строку в QTreeView. Я также использую метод setNameFilters, связанный с QLineEdit, поэтому пользователь может указать, какие расширения файлов он хочет отображать в файле QTreeView. Я заметил следующее поведение:
1) Когда я запускаю программу и ввожу расширения для фильтрации (не трогая ни одного узла из QTreeView) все работает нормально и файлы с указанными мной расширениями только отображаются (и папки конечно). Когда я меняю расширения и вид обновляется, на моем диске "C:/" все обновляется и отображается только новый набор расширений. Когда я расширяю какой-то другой диск, который я раньше не трогал, он также правильно показывает файлы.
2) Когда я запускаю программу и расширяю, скажем, мои диски "C:/" и "D:/", я вижу все каталоги и файлы (ожидаемое поведение). Затем я пишу некоторые расширения, и представление обновляется. Расширяю диск "C:/" и все работает нормально, отображаются только файлы с указанными мной расширениями. Потом захожу на "D:/" диск и вот проблема. Он отображает все файлы. Он игнорирует фильтры, которые я предоставил. Когда я открываю диск "E:/", который я раньше не открывал, файлы фильтруются правильно, как и на диске "C:/".
Я пришел к выводу, что такое поведение как-то связано с методом setRootPath, потому что для моего QTreeView только на "C:/" диске фильтры работают корректно. Все остальные диски, которые были расширены до смены фильтров, не работают. Те, что не расширены, работают нормально.
Вопрос в том, как заставить это работать, чтобы после того, как пользователь меняет фильтры и запускается метод reset (), обновляется весь QTreeView, а не только корневой путь и нерасширенные элементы? Может быть, существует какой-то корневой путь, по которому все диски являются дочерними, и он будет работать должным образом? Или, может быть, мне следует создать в QTreeView какую-нибудь виртуальную папку с именем "MyComputer" и сделать ее родительской для всех дисков? Но как получить список всех доступных дисков?
Я надеюсь, что то, что я написал, понятно для вас, и вы можете помочь мне заставить это работать.
Редактировать: добавление соответствующего кода. Если вам нужно больше, просто спросите.
//setting up the model and view
QString rPath = "C:/";
rTree_model = new TreeModel(this); //TreeModel inherits from QFileSystemModel
rTree_model->setRootPath(rPath);
ui->rTree->setModel(rTree_model); //applies the model for the qtreeview (ui->rTree)
//(...)
//action when extensions were provided by user
QString extensions = QString(ui->extensionBox->text()); //gets extensions provided by user
QStringList filters;
if(extensions.length() > 0) {
filters = extensions.split(";", QString::SkipEmptyParts); //splits extensions provided with ';' as separator
rTree_model->setNameFilters(filters); //applies filters
ui->rTree->reset(); //resets the view
}