我在QT c ++中有这段代码
void writeInFile()
{
QFile file(":/texts/test.txt");
if(file.open(QIODevice::ReadWrite))
{
QTextStream in(&file);
in<<"test";
}
file.close();
}
我想在我的文本文件中添加“test”,该文件位于带有前缀“texts”的资源中,但是这个函数什么都不做,当我使用“QIODevice :: ReadWrite”进行操作时,我无法写入或读取文件“或”QFile :: ReadWrite“,我只能在readonly模式下读取它。任何帮助或建议欢迎。
答案 0 :(得分:1)
Qt资源文件是只读的,因为它们作为“代码”放入二进制文件中 - 并且应用程序无法自行修改。
由于编辑资源根本不可能,因此您应该遵循缓存这些文件的标准方法。这意味着您将资源复制到本地计算机并编辑该资源。
这是一个完全正确的基本功能:
QString cachedResource(const QString &resPath) {
// not a ressource -> done
if(!resPath.startsWith(":"))
return resPath;
// the cache directory of your app
auto resDir = QStandardPaths::writableLocation(QStandardPaths::CacheLocation);
auto subPath = resDir + "/resources" + resPath.mid(1); // cache folder plus resource without the leading :
if(QFile::exists(subPath)) // file exists -> done
return subPath;
if(!QFileInfo(subPath).dir().mkpath("."))
return {}; //failed to create dir
if(!QFile::copy(resPath, subPath))
return {}; //failed to copy file
// make the copied file writable
QFile::setPermissions(subPath, QFileDevice::ReadUser | QFileDevice::WriteUser);
return subPath;
}
简而言之,它将资源复制到缓存位置(如果该位置尚不存在)并返回该缓存资源的路径。需要注意的一点是,复制操作会预先设置“只读”权限,这意味着我们必须手动设置权限。如果您需要不同的权限(即执行或访问组/全部),您可以调整该行。
在您的代码中,您将更改该行:
QFile file(cachedResource(":/texts/test.txt"));