QFileSystemModel и QTreeView — странное поведение при сбросе представления

Я написал это на официальных форумах 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
}

0

Решение

Попробуйте изменить корневой путь на Мой компьютер вместо 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);
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]