Получить текущий рабочий каталог в приложении Qt - PullRequest
66 голосов
/ 13 сентября 2011

Я пишу программу на C ++ с использованием библиотеки Qt.В моем домашнем каталоге bin есть символическая ссылка на исполняемый файл.Мне бы хотелось, чтобы текущим рабочим каталогом моей программы был каталог, в котором я нахожусь с моим терминалом (т. Е. Результат команды pwd).Я видел функцию QDir::currentPath(), но она возвращает каталог, в котором находится бинарный файл.

Как мне найти мой текущий рабочий каталог?

Ответы [ 5 ]

87 голосов
/ 13 сентября 2011

Только что протестировано и QDir::currentPath() возвращает путь, по которому я назвал свой исполняемый файл.

И символическая ссылка не "существует".Если вы выполняете exe с этого пути, вы фактически выполняете его с пути, на который указывает символическая ссылка.

50 голосов
/ 13 сентября 2011

Вы пробовали QCoreApplication :: applicationDirPath ()

qDebug() << "App path : " << qApp->applicationDirPath();
9 голосов
/ 20 января 2015

Чтобы добавить ответ 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();
}

Используя его в QML

....
........
............
Text{
text:"This is the applications path: " + appPath
+ "\nThis is the users home directory: " + homePath
+ "\nThis is the Desktop path: " desktopPath;
}
3 голосов
/ 14 августа 2015

Я запускаю Qt 5.5 под Windows, и конструктор по умолчанию QDir, кажется, выбирает текущий рабочий каталог, а не каталог приложения.

Я не уверен, что getenv PWD будет работать перекрестноплатформе, и я думаю, что он установлен в текущий рабочий каталог, когда оболочка запустила приложение, и не включает в себя никаких изменений рабочего каталога, сделанных самим приложением (возможно, именно поэтому OP видит такое поведение).

Поэтому я решил добавить несколько других способов, которые должны дать вам текущий рабочий каталог (а не двоичное местоположение приложения):

// 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;
3 голосов
/ 14 сентября 2011

Спасибо RedX и Kaz за ваши ответы.Я не понимаю, почему со мной это дает путь exe.Я нашел другой способ сделать это:

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

Это менее элегантно, чем одна строка ... но это работает для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...