在 Qt Creator 中加载具有相对路径的文件

Posted

技术标签:

【中文标题】在 Qt Creator 中加载具有相对路径的文件【英文标题】:Loading a file with a relative path in Qt Creator 【发布时间】:2016-02-17 17:03:55 【问题描述】:

我正在 Ubuntu 14.04 中使用 Qt Creator 3.1.1 编写 C++ 程序。此代码使用现有的库,该库通过传递表示该文件路径的字符串从磁盘加载文件。我遇到的问题是,当字符串表示绝对路径时,文件加载正常,但是当字符串表示相对路径时,加载失败,说找不到文件。

我的项目在/home/karnivaurus/project/src 有源文件,在/home/karnivaurus/project/build 有构建文件。我已将文件mesh.stl 的副本放置在每个目录中,以及项目根目录/home/karnivaurus/project 中。但是当我传递字符串../src/mesh.stl../build/mesh.stl../mesh.stl 时,它无法加载。它也会因/../src/mesh.stl/../build/mesh.stl../src/mesh.stl../build/mesh.stl../mesh.stl 而失败。

但是,如果我传递字符串 /home/karnivaurus/project/src/mesh.stl/home/karnivaurus/project/build/mesh.stl/home/karnivaurus/project/mesh.stl,它确实会找到文件。

这是为什么?我对 C++ 中相对路径的理解有问题吗?还是我需要在 Qt Creator 中配置?在我的 Qt Creator 设置中,我将工作目录设置为 /home/karnivaurus/project/build

我用来加载网格的确切行是:

const aiScene* mesh = MeshLib::loadMesh("../mesh.stl");

而对应的错误信息是:

Failed opening file '/mesh.stl' for reading: No such file or directory

这个错误信息对我来说很可疑,因为/mesh.stl 不等于../mesh.stl...

【问题讨论】:

您能否验证运行时的工作文件夹确实是您在此处假设的项目文件夹?一种方法是将文件写入路径./dummy.txt,然后查看文件的创建位置。 我尝试将文件写入dummy.txt,它按预期将其写入/home/karnivaurus/project/build/dummy.txt。 (与./dummy.txt 相同) 您究竟是如何加载 .stl 文件的?您可以分享您尝试打开文件的代码行吗? 该行是:const aiScene* mesh = MeshLib::LoadMesh("mesh.stl");,或const aiScene* mesh = MeshLib::LoadMesh("../build/mesh.stl");等... 这很奇怪。我会查看LoadMesh,看看他们是否对给定的文件路径做了什么特别的事情......你也试过./../build/mesh.stl吗? 【参考方案1】:

看起来您已经确定工作目录是正确的。鉴于消除了这种可能性,剩下的就是 3rd 方库中的一个错误。

你可以使用Qt构造一个绝对路径:

QString meshPath = QDir().filePath("../mesh.stl"); 
const aiScene* mesh = MeshLib::loadMesh(meshPath.toLatin1().data());

在库的开发人员修复错误之前,这可以作为解决方法。

【讨论】:

或者您可以使用QDir().absoluteFilePath("../mesh.stl") 将绝对路径传递给MeshLib。

以上是关于在 Qt Creator 中加载具有相对路径的文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在qt creator中设置环境变量

求助,QT creator怎么定义全局变量

使用外部库找不到入口点错误

无法在 Qt5/cmake 项目中加载 Qt 资源文件中指定的图像

怎么在Qt creator中加入命令行参数进行编译程序

如何在 Qt 中从 txt 文件中加载大数据