如何更新QFileSystemModel中的文件权限

How to update file permissions in a QFileSystemModel

本文关键字:文件 权限 QFileSystemModel 何更新 更新      更新时间:2023-10-16

是否有方法在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两次——一次用于签出,第二次用于实际更改文件。