【问题标题】:Qt how to open a file in current dir ? or what's wrong with this?Qt如何在当前目录中打开文件?或者这有什么问题?
【发布时间】:2011-01-19 04:29:09
【问题描述】:

我正在尝试在可执行文件的当前位置打开一个 xml 文件

        QString path = QDir::currentPath();
        path.append("/acc.xml");
        QFile file(path);

        if(!file.open(QIODevice::ReadOnly))
        {
            insertItem("IO ERR");
        }
  • 当我从 Qt creator 运行它时,一切正常。 currentPath() 返回可执行文件所在文件夹的路径

  • 当我转到project-build-desktop/ 文件夹并尝试手动运行它时currentPath() 返回/home/user/Documents

编辑

也尝试过同样的结果:

Qt::current().path();
Qt::current().absolutePath();

【问题讨论】:

  • 问题显然来自文档的路径。
  • 正确的方法是什么?我已经花了将近 2 个小时试图弄清楚/理解 Qt

标签: c++ qt qt-creator qmake


【解决方案1】:

尝试使用 QCoreApplication::applicationDirPath() 代替 QDir::currentPath()。

详情见http://doc.qt.io/qt-5/qcoreapplication.html#applicationDirPath

【讨论】:

    【解决方案2】:

    检查QDir::currentPath()的返回值。我认为当您从 Qt Creator 运行时,它会返回项目文件 (*.pro) 所在的路径。当你从外部运行时,你会得到二进制文件的路径。

    编辑

    我从未使用过 Linux。不过你可以试试QDir的其他功能/组合:

    • QDir::current().path()
    • QDir::current().absolutePath()

    等等

    【讨论】:

    • 从外面是/home/user/Documents。但是我正在运行的可执行文件显然不存在......
    • 我实际上需要二进制文件的路径......而当我从外部运行它时不会发生这种情况
    • 相同的结果。来自 Qt-Creator - 好的,外面 - 不是。
    • @Vic.:在应用程序中使用 Qt 的 Windows 上,每次应用程序启动时,它都会创建一个目录(如果不存在),其中存在二进制文件。当我回到家时,我会告诉你我是怎么做到的。据我记得,它是 QDir::current().mkdir("saves")。它可以与 Qt Creator 和其他类似的东西一起使用。
    • @Vic.: 抱歉,我使用 'QDir().mkdir(_path);'创建目录。
    【解决方案3】:

    要打开当前目录中的文件,只需调用 QFile 构造函数

    我在我的 Linux 机器上测试了它,它可以工作

    #include <QtCore>
    
    int main(int argc, char** argv){
        QFile some_file("test.xml");
        if(!some_file.open(QIODevice::ReadOnly | QIODevice::Text)){
            qDebug() << "Unable to open file";
        } else {
            qDebug() << "File open successfully";
        }
        exit(-1);
    }
    

    我运行./TestQFile,如果当前目录中有test.xml,它就可以工作。

    更新:我注意到您问题的措辞表明您希望文件与可执行文件位于同一目录中,可以按如下方式完成:

    // Getting directory of the executable
    QFileInfo exec_fileinfo(argv[0]);
    qDebug() << "Executable is in" << exec_fileinfo.absolutePath();
    

    更新 2:在 QtCreator 的项目面板下,有一个工作目录字段。如果您通过 QtCreator 运行它,这是 QDir::currentPath() 返回的目录。

    【讨论】:

    • 我没有使用 QtCreator 来编写代码。您能否提供有关您的目录结构的更多详细信息以及您为重现文件打开错误而运行的确切命令?
    • 在运行我的项目时,QtCreator 似乎做了某种magic。这是我正在尝试设计的 GUI 应用程序。从outside 我通常不带参数运行应用程序,只是click
    • 试图查看 QtCreator 是如何运行它的.. 仅找到:Starting /home/user/Projects/Project-build-desktop/Project...
    • 啊哈,问题是当您单击应用程序时,它从 $HOME 运行。如果要从特定目录运行应用程序,则需要 cd 到该目录,然后执行可执行文件的完整路径。 QtCreator 会自动为您执行此操作。我建议您尝试:1)我发布的获取可执行文件位置的方法 2)将查找文件的位置存储在 QSettings 对象中。
    【解决方案4】:

    我在寻找类似解决方案时发现了这个讨论。我认为打开具有固定名称(不涉及对话框和用户)的外部文件的最便携方式是使用Resource System

    在我的例子中,我创建了一个前缀为 /config 的新资源文件并添加了该文件(称为 settings.xml)。在代码中,我根本不需要使用任何路径函数。我改用资源系统。因此,像QFile file(":/config/settings.xml") 这样的电话可以正常工作。在 Windows 上使用 QT creator 2.0.1 和 QT 4.7。

    【讨论】:

    • 我自己评论一下,此解决方案有效,但缺点是无法修改 XML 文件,因为它已转换为二进制资源文件。如果您需要能够修改 XML 内容并在不重新编译的情况下执行应用程序,请使用此处提供的其余解决方案之一。
    【解决方案5】:

    我的建议是:文件名 + 文件的绝对路径,然后再打开。为此,我在QCoreApplication 对象(在我的例子中为a 对象)调用applicationDirPath 方法,它返回应用程序可执行文件的路径。无需通过 argv 数组。就是这样并且有效

     int main(int argc, char *argv[]) {
       QCoreApplication a(argc, argv);
       const QString fileName = "someJsonFile.JSON";
       const QString currentExecDir = a.applicationDirPath();
       QFile myFile(currentExecDir + '/' + fileName);
       if (myFile.open(QIODevice::ReadOnly)) {
        qDebug()<< "The file "<< fileName<< " has been opened successfully";
       }
       else {
         qDebug()<< "Failed to open file "<< fileName<< " in "<< currentExecDir;
       }
       return a.exec();
    }
    

    注意 请参阅 Qt 文档了解 applicationDirPath 方法,因为它假定当前目录没有被应用程序更改

    【讨论】:

      猜你喜欢
      • 2011-01-23
      • 1970-01-01
      • 2017-02-14
      • 1970-01-01
      • 1970-01-01
      • 2011-07-30
      • 2016-02-28
      • 1970-01-01
      • 2018-01-21
      相关资源
      最近更新 更多