Я написал это на официальных форумах 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
}
Попробуйте изменить корневой путь на Мой компьютер вместо C: /. Кажется, он работает с QFileSystemModel в Windows 7 x64 и Qt 4.8.2, но я не могу ничего гарантировать для других платформ.
rTree_model = new TreeModel(this);
QString rPath = model->myComputer().toString(); //causes the QFileSystemWatcher to watch every drive?
rTree_model->setRootPath(rPath);
ui->rTree->setModel(rTree_model);
Других решений пока нет …