developer tip

Qt 애플리케이션에서 현재 작업 디렉토리 가져 오기

copycodes 2020. 11. 10. 08:18
반응형

Qt 애플리케이션에서 현재 작업 디렉토리 가져 오기


Qt 라이브러리를 사용하여 C ++로 프로그램을 작성하고 있습니다. 내 홈 bin 디렉토리에 실행 파일에 대한 심볼릭 링크가 있습니다. 내 프로그램의 현재 작업 디렉토리가 터미널과 함께있는 디렉토리 (즉, pwd명령 의 결과)가되기를 원합니다 . 나는 보았다 QDir::currentPath()기능을하지만 바이너리 디렉토리를 다시 제공합니다.

현재 작업 디렉토리를 어떻게 찾을 수 있습니까?


방금 테스트하고 QDir::currentPath()실행 파일을 호출 한 경로를 반환합니다.

그리고 심볼릭 링크는 "존재"하지 않습니다. 해당 경로에서 exe를 실행하는 경우 symlink가 가리키는 경로에서 효과적으로 실행하는 것입니다.


QCoreApplication :: applicationDirPath () 를 사용해 보셨습니까?

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

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

답변 해주신 RedX와 Kaz에게 감사드립니다. 나는 왜 그것이 exe의 경로를 제공하는지 이해하지 못합니다. 다른 방법을 찾았습니다.

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

한 줄보다 덜 우아하지만 ...


Windows에서 Qt 5.5를 실행하고 있으며 QDir의 기본 생성자가 응용 프로그램 디렉토리가 아닌 현재 작업 디렉토리를 선택하는 것처럼 보입니다.

getenv PWD가 크로스 플랫폼에서 작동하는지 확실하지 않으며 셸이 응용 프로그램을 시작할 때 현재 작업 디렉터리로 설정되어 있고 앱 자체에서 수행 한 작업 디렉터리 변경 사항을 포함하지 않는다고 생각합니다. 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;

참고URL : https://stackoverflow.com/questions/7402576/get-current-working-directory-in-a-qt-application

반응형