获取Qt应用程序中的当前工作目录 我用Qt库编写C++程序。在我的主bin目录中有一个指向可执行文件的符号链接。我希望我的程序的当前工作目录是我使用终端时所在的目录(即pwd命令的结果)。我看到了QDir::currentPath()函数,但它返回了二进制文件所在的目录

获取Qt应用程序中的当前工作目录 我用Qt库编写C++程序。在我的主bin目录中有一个指向可执行文件的符号链接。我希望我的程序的当前工作目录是我使用终端时所在的目录(即pwd命令的结果)。我看到了QDir::currentPath()函数,但它返回了二进制文件所在的目录,c++,qt,C++,Qt,如何找到当前的工作目录?刚刚测试过,并且QDir::currentPath()会返回调用可执行文件的路径 并且符号链接不“存在”。如果从该路径执行exe,则实际上是从符号链接指向的路径执行它。是否尝试过 qDebug()感谢RedX和Kaz的回答。我不明白为什么它给出了exe的路径。我找到了另一种方法: QString pwd(""); char * PWD; PWD = getenv ("PWD"); pwd.append(PWD); cout << "Working direct

如何找到当前的工作目录?

刚刚测试过,并且
QDir::currentPath()
会返回调用可执行文件的路径

并且符号链接不“存在”。如果从该路径执行exe,则实际上是从符号链接指向的路径执行它。

是否尝试过


qDebug()感谢RedX和Kaz的回答。我不明白为什么它给出了exe的路径。我找到了另一种方法:

QString pwd("");
char * PWD;
PWD = getenv ("PWD");
pwd.append(PWD);
cout << "Working directory : " << pwd << flush;
QString pwd(“”);
字符*PWD;
PWD=getenv(“PWD”);
追加(pwd);
加上KaZ的答案,
每当我制作一个QML应用程序时,我倾向于将它添加到主c++

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QStandardPaths>

int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;

// get the applications dir path and expose it to QML 

QUrl appPath(QString("%1").arg(app.applicationDirPath()));
engine.rootContext()->setContextProperty("appPath", appPath);


// Get the QStandardPaths home location and expose it to QML 
QUrl userPath;
   const QStringList usersLocation = QStandardPaths::standardLocations(QStandardPaths::HomeLocation);
   if (usersLocation.isEmpty())
       userPath = appPath.resolved(QUrl("/home/"));
   else
      userPath = QString("%1").arg(usersLocation.first());
   engine.rootContext()->setContextProperty("userPath", userPath);

   QUrl imagePath;
      const QStringList picturesLocation = QStandardPaths::standardLocations(QStandardPaths::PicturesLocation);
      if (picturesLocation.isEmpty())
          imagePath = appPath.resolved(QUrl("images"));
      else
          imagePath = QString("%1").arg(picturesLocation.first());
      engine.rootContext()->setContextProperty("imagePath", imagePath);

      QUrl videoPath;
      const QStringList moviesLocation = QStandardPaths::standardLocations(QStandardPaths::MoviesLocation);
      if (moviesLocation.isEmpty())
          videoPath = appPath.resolved(QUrl("./"));
      else
          videoPath = QString("%1").arg(moviesLocation.first());
      engine.rootContext()->setContextProperty("videoPath", videoPath);

      QUrl homePath;
      const QStringList homesLocation = QStandardPaths::standardLocations(QStandardPaths::HomeLocation);
      if (homesLocation.isEmpty())
          homePath = appPath.resolved(QUrl("/"));
      else
          homePath = QString("%1").arg(homesLocation.first());
      engine.rootContext()->setContextProperty("homePath", homePath);

      QUrl desktopPath;
      const QStringList desktopsLocation = QStandardPaths::standardLocations(QStandardPaths::DesktopLocation);
      if (desktopsLocation.isEmpty())
          desktopPath = appPath.resolved(QUrl("/"));
      else
          desktopPath = QString("%1").arg(desktopsLocation.first());
      engine.rootContext()->setContextProperty("desktopPath", desktopPath);

      QUrl docPath;
      const QStringList docsLocation = QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation);
      if (docsLocation.isEmpty())
          docPath = appPath.resolved(QUrl("/"));
      else
          docPath = QString("%1").arg(docsLocation.first());
      engine.rootContext()->setContextProperty("docPath", docPath);


      QUrl tempPath;
      const QStringList tempsLocation = QStandardPaths::standardLocations(QStandardPaths::TempLocation);
      if (tempsLocation.isEmpty())
          tempPath = appPath.resolved(QUrl("/"));
      else
          tempPath = QString("%1").arg(tempsLocation.first());
      engine.rootContext()->setContextProperty("tempPath", tempPath);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}

我在Windows下运行Qt5.5,QDir的默认构造函数似乎选择了当前的工作目录,而不是应用程序目录

我不确定getenv PWD是否能够跨平台工作,我认为它在shell启动应用程序时被设置为当前工作目录,并且不包括应用程序本身所做的任何工作目录更改(这可能是OP看到这种行为的原因)

因此,我想我应该添加一些其他方式,以提供当前工作目录(而不是应用程序的二进制位置):

//使用相对文件名结束的位置
QFileInfo金融机构(“临时”);

QDir默认构造函数能否给出相同的结果?是:
QDir dir;Cout QDir::currentPath()和dir.absolutePath()都返回命令行的当前目录。如果我阅读了文档,这将给出可执行文件所在的目录。但是我想要调用可执行文件的目录。这通常会起作用,但不是每个人都会使用QCoreApplication。例如,我的QTest不允许我使用它。使用applicationDirPath的问题在于,在不同的操作系统上,返回的路径可能不同,在Mac上,应用程序打包在file.app文件中,当调用appliciationDirPath时,您会得到打包在file.appThank-you Mark中的文件位置和文件夹,但我已经在linux下用Qt5.3.2测试了两个解决方案,都给出了二进制位置…Windows上的Qt 5.8在这两种情况下都给出了工作目录。我也用QFileInfo(“.”)得到了它。absolutePath()现在有一个StandardPaths QML模块:
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QStandardPaths>

int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;

// get the applications dir path and expose it to QML 

QUrl appPath(QString("%1").arg(app.applicationDirPath()));
engine.rootContext()->setContextProperty("appPath", appPath);


// Get the QStandardPaths home location and expose it to QML 
QUrl userPath;
   const QStringList usersLocation = QStandardPaths::standardLocations(QStandardPaths::HomeLocation);
   if (usersLocation.isEmpty())
       userPath = appPath.resolved(QUrl("/home/"));
   else
      userPath = QString("%1").arg(usersLocation.first());
   engine.rootContext()->setContextProperty("userPath", userPath);

   QUrl imagePath;
      const QStringList picturesLocation = QStandardPaths::standardLocations(QStandardPaths::PicturesLocation);
      if (picturesLocation.isEmpty())
          imagePath = appPath.resolved(QUrl("images"));
      else
          imagePath = QString("%1").arg(picturesLocation.first());
      engine.rootContext()->setContextProperty("imagePath", imagePath);

      QUrl videoPath;
      const QStringList moviesLocation = QStandardPaths::standardLocations(QStandardPaths::MoviesLocation);
      if (moviesLocation.isEmpty())
          videoPath = appPath.resolved(QUrl("./"));
      else
          videoPath = QString("%1").arg(moviesLocation.first());
      engine.rootContext()->setContextProperty("videoPath", videoPath);

      QUrl homePath;
      const QStringList homesLocation = QStandardPaths::standardLocations(QStandardPaths::HomeLocation);
      if (homesLocation.isEmpty())
          homePath = appPath.resolved(QUrl("/"));
      else
          homePath = QString("%1").arg(homesLocation.first());
      engine.rootContext()->setContextProperty("homePath", homePath);

      QUrl desktopPath;
      const QStringList desktopsLocation = QStandardPaths::standardLocations(QStandardPaths::DesktopLocation);
      if (desktopsLocation.isEmpty())
          desktopPath = appPath.resolved(QUrl("/"));
      else
          desktopPath = QString("%1").arg(desktopsLocation.first());
      engine.rootContext()->setContextProperty("desktopPath", desktopPath);

      QUrl docPath;
      const QStringList docsLocation = QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation);
      if (docsLocation.isEmpty())
          docPath = appPath.resolved(QUrl("/"));
      else
          docPath = QString("%1").arg(docsLocation.first());
      engine.rootContext()->setContextProperty("docPath", docPath);


      QUrl tempPath;
      const QStringList tempsLocation = QStandardPaths::standardLocations(QStandardPaths::TempLocation);
      if (tempsLocation.isEmpty())
          tempPath = appPath.resolved(QUrl("/"));
      else
          tempPath = QString("%1").arg(tempsLocation.first());
      engine.rootContext()->setContextProperty("tempPath", tempPath);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
....
........
............
Text{
text:"This is the applications path: " + appPath
+ "\nThis is the users home directory: " + homePath
+ "\nThis is the Desktop path: " desktopPath;
}
// using where a relative filename will end up
QFileInfo fi("temp");
cout << fi.absolutePath() << endl;

// explicitly using the relative name of the current working directory
QDir dir(".");
cout << dir.absolutePath() << endl;