Есть ли способ обновить права доступа к файлу в QFileSystemModel (c ++)? Прежде чем разрешить пользователю переименовывать файл, указанный в модели, с помощью qtreeview, я проверяю, что файл извлечен из системы контроля версий. На данный момент файл больше не только для чтения, но модель по-прежнему считает, что он только для чтения. Как я могу заставить модель обновлять права доступа к файлу, не теряя состояния развернуть / свернуть дерево?
Спасибо!
Обновить:
Файл уже помечен как доступный для записи после извлечения файла. Модель до сих пор не знает об изменениях.
QFile file(path.c_str());
QFileDevice::Permissions perms = file.permissions();
if (perms & QFile::WriteUser)
{
// Is already true
}
Просто чтобы быть уверенным, я пошел вперед и использовал
file.setPermissions(file.permissions() | QFile::WriteUser);
без удачи изменив разрешения, указанные для этого файла в модели.
Обновить:
int perms = fsModel->data(index, QFileSystemModel::Roles::FilePermissions).value<int>();
if (perms & QFile::WriteUser)
{
int i = 0;
}
Примечание: вышеуказанные разрешения никогда не имеют установленного флага QFile :: WriteUser, если файл не был доступен для записи до того, как была создана модель.
setRootPath () также является ключом к решению этой проблемы. Кажется, вам нужно вызвать его дважды, чтобы обновить права доступа только для чтения. Я наткнулся на это, когда я изменил свой код выбора для вызова:
m_pFileModel->setRootPath("");
m_pFileModel->setRootPath(path.c_str());
каждый раз, когда элемент был выбран. Затем, когда я дважды щелкнул по элементу, я увидел, что значок изменился на отмеченный. Конечно, это не сразу позволило мне переименовать его, мне пришлось дважды щелкнуть по нему снова, но это работает.
Мой процесс:
Подключитесь к сигналу OnBeginEdit () и проверьте файл / измените разрешения
Когда элемент выбран:
m_pFileModel->setRootPath("");
m_pFileModel->setRootPath(path.c_str());
Внутри OnBeginEdit ()
Сделайте следующее ДВАЖДЫ, если вы не указали путь к текущей папке при выборе элемента
m_pFileModel->setRootPath("");
m_pFileModel->setRootPath(path.c_str());
Имейте в виду, вам придется дважды щелкнуть дважды или дважды нажать клавишу F2 — один раз, чтобы оформить заказ, и второй, чтобы фактически изменить файл.