写入文本文件错误,QT

时间:2018-05-14 13:07:36

标签: c++ qt

我在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模式下读取它。任何帮助或建议欢迎。

1 个答案:

答案 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"));