C++ 获取 Qt 应用程序中的当前工作目录

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/7402576/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-28 16:53:02  来源:igfitidea点击:

Get current working directory in a Qt application

c++qt

提问by Geoffroy

I'm writing a program in C++ using the Qt library. There is a symbolic link in my home bin directory to the executable. I would like the current working directory of my program to be the directory in which I am with my terminal (ie. the result of the pwdcommand). I saw the QDir::currentPath()function, but it gives back the directory where the binary is.

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

How can I find my current working directory?

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

采纳答案by Geoffroy

Thank you RedX and Kaz for your answers. I don't get why by me it gives the path of the exe. I found an other way to do it :

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

QString pwd("");
char * PWD;
PWD = getenv ("PWD");
pwd.append(PWD);
cout << "Working directory : " << pwd << flush;

It is less elegant than a single line... but it works for me.

它不如单行优雅......但它对我有用。

回答by RedX

Just tested and QDir::currentPath()does return the path from which I called my executable.

刚刚测试并QDir::currentPath()返回了我调用可执行文件的路径。

And a symlink does not "exist". If you are executing an exe from that path you are effectively executing it from the path the symlink points to.

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

回答by KaZ

Have you tried QCoreApplication::applicationDirPath()

你有没有试过QCoreApplication::applicationDirPath()

qDebug() << "App path : " << qApp->applicationDirPath();

回答by joseph

To add on to KaZ answer, Whenever I am making a QML application I tend to add this to the main c++

添加到 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();
}

Using it in QML

在 QML 中使用它

....
........
............
Text{
text:"This is the applications path: " + appPath
+ "\nThis is the users home directory: " + homePath
+ "\nThis is the Desktop path: " desktopPath;
}

回答by Mark Walker

I'm running Qt 5.5 under Windows and the default constructor of QDir appears to pick up the current working directory, not the application directory.

我在 Windows 下运行 Qt 5.5 并且 QDir 的默认构造函数似乎选择当前工作目录,而不是应用程序目录。

I'm not sure if the getenv PWD will work cross-platform and I think it is set to the current working directory when the shell launched the application and doesn't include any working directory changes done by the app itself (which might be why the OP is seeing this behavior).

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

So I thought I'd add some other ways that should give you the current working directory (not the application's binary location):

所以我想我会添加一些其他方式来为您提供当前工作目录(而不是应用程序的二进制位置):

// 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;