Невозможно переместить/переименовать/удалить папку, пока некоторые из ее подпапок развернуты в QFileSystemModel

Я разрабатываю приложение Qt для Windows. Чтобы показать файлы определенной папки, я использую QTreeView вместе с QFileSystemModel. Пока все хорошо, но я столкнулся с очень специфической проблемой, которая сводит меня с ума: пока у меня есть папка, развернутая в моем приложении, я ничего не могу сделать с ее родительской папкой.

Я построил небольшой проект только для того, чтобы показать эту проблему. Вот как я определяю свою QFileSystemModel и применяю ее к моему QTreeView:

QFileSystemModel *myModel = new QFileSystemModel;
myModel->setRootPath(myRootPath);
ui->treeView->setModel(myModel);

Чтобы проиллюстрировать мою проблему, посмотрите это изображение

Пока у меня «Тестовая папка 2» не расширена, я могу делать то, что хочу, с «Тестовой папкой». Я могу переименовывать, перемещать или даже удалять через проводник Windows, и все это применяется к моей программе. Однако, когда я разворачиваю «Тестовую папку 2», вдруг моя «Тестовая папка» больше не редактируется. Windows говорит, что папка "открыта в другом приложении".

Я считаю, что любой может воспроизвести эту проблему с помощью трех строк выше, поэтому я не думаю, что это проблема конкретного проекта. Кто-нибудь знает, почему это происходит?

EDIT: По-видимому, это проблема только для Windows. Только что попробовал на линуксе, все работает. Это проблема NTFS? Есть идеи?


person Pericles Carvalho    schedule 16.06.2019    source источник


Ответы (1)


Вы должны попытаться установить свойство только для чтения.

#include <QApplication>
#include <QTreeView>
#include <QFileSystemModel>

int main(int argc, char** args) {
    QApplication app(argc, args);
    auto myModel = new QFileSystemModel;
    myModel->setReadOnly(true);
    auto treeView = new QTreeView;
    myModel->setRootPath("C:/Temp/A");
    treeView->setModel(myModel);
    treeView->show();
    app.exec();
}
person Aleph0    schedule 17.06.2019
comment
@PericlesCarvalho: Это странно. Я попробовал это с setReadOnly(false), и мне не удалось отредактировать папку. Затем я изменил на setReadOnly(true), и это сработало. - person Aleph0; 17.06.2019
comment
@PericlesCarvalho: только что попробовал еще раз под Ubuntu, и это все то же желаемое поведение. - person Aleph0; 17.06.2019
comment
Это действительно странно, потому что я использую Linux Mint (файловая система ext4), и он работает, даже если я не использую setReadOnly. В Windows (файловая система NTFS) это не работает в любом случае. Какую версию Qt вы используете? - person Pericles Carvalho; 17.06.2019
comment
@PericlesCarvalho: qtdiag говорит, что я использую Qt 5.9.5 дома! На работе стояла 5.10.0 и тоже работала на Windows 7. - person Aleph0; 17.06.2019