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

Geo*_*roy 67 c++ qt

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

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

Red*_*edX 92

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

符号链接不"存在".如果从该路径执行exe,则可以从符号链接指向的路径中有效地执行它.


小智 53

你试过QCoreApplication :: applicationDirPath()吗?

qDebug() << "App path : " << qApp->applicationDirPath();
Run Code Online (Sandbox Code Playgroud)

  • 如果我阅读文档,这将给dir可执行文件.但是我想要从中调用可执行文件的目录. (9认同)
  • 这通常会起作用,但不是每个人都会使用QCoreApplication.例如,我的QTest不会让我使用它. (2认同)

小智 10

要添加到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();
}
Run Code Online (Sandbox Code Playgroud)

在QML中使用它

....
........
............
Text{
text:"This is the applications path: " + appPath
+ "\nThis is the users home directory: " + homePath
+ "\nThis is the Desktop path: " desktopPath;
}
Run Code Online (Sandbox Code Playgroud)


Geo*_*roy 4

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

QString pwd("");
char * PWD;
PWD = getenv ("PWD");
pwd.append(PWD);
cout << "Working directory : " << pwd << flush;
Run Code Online (Sandbox Code Playgroud)

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

  • 我也用 QFileInfo(".").absolutePath() 得到了它 (3认同)