2011-09-13 16 views
55

Piszę program w C++ przy użyciu biblioteki Qt. W katalogu domowym bin znajduje się dowiązanie symboliczne do pliku wykonywalnego. Chciałbym, aby bieżący katalog roboczy mojego programu był katalogiem, w którym znajduję się mój terminal (tj. Wynikiem polecenia pwd). Widziałem funkcję QDir::currentPath(), ale ona zwraca katalog, w którym znajduje się plik binarny.Pobierz bieżący katalog roboczy w aplikacji Qt

Jak mogę znaleźć mój aktualny katalog roboczy?

+1

Czy konstruktor domyślny QDir dać taki sam efekt? – cmannett85

+2

Tak: 'QDir dir; Cout << dir.absolutePath() << flush; 'daje mi katalog, w którym znajduje się plik wykonywalny. – Geoffroy

+1

Zarówno QDir :: currentPath(), jak i dir.absolutePath() zwracają bieżący katalog linii poleceń. – Flint

Odpowiedz

2

Dziękuję RedX i Kaz za odpowiedzi. Nie rozumiem dlaczego przeze mnie podaje ścieżkę exe. Znalazłem inny sposób:

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

Jest mniej elegancki niż pojedyncza linia ... ale działa dla mnie.

+0

Mam to również z QFileInfo ("."). AbsolutePath() – crgarridos

71

Właśnie przetestowane i QDir::currentPath() zwraca ścieżkę, z której nazwałem mój plik wykonywalny.

A dowiązanie symboliczne nie "istnieje". Jeśli wykonujesz exe z tej ścieżki, efektywnie wykonujesz ją ze ścieżki, do której wskazuje dowiązanie symboliczne.

+0

http://doc-snapshot.qt-project.org/4.8/qdir.html#currentPath –

39

Czy próbowałeś QCoreApplication::applicationDirPath()

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

Po przeczytaniu dokumentacji, daje to katalog, w którym znajduje się plik wykonywalny. Ale chciałem stworzyć katalog, z którego wywoływany jest plik wykonywalny. – Geoffroy

+0

To na ogół zadziała, ale nie wszyscy będą używać QCoreApplication. Na przykład mój test QTest nie pozwala mi tego użyć. –

7

Aby dodać do Kaz odpowiedź, Ilekroć Robię aplikację QML staram się dodać do głównego 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(); 
} 

Używanie go w QML

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

Istnieje teraz moduł QML StandardPaths: https://doc.qt.io/qt-5/qml-qt-labs-platform-standardpaths.html –

2

biegnę Qt 5.5 w systemie Windows i domyślny konstruktor QDir pojawi się, aby pobrać bieżący katalog roboczy, a nie katalog aplikacji.

Nie jestem pewien, czy getenv PWD będzie działać na wielu platformach i myślę, że jest ustawiony na bieżący katalog roboczy, gdy powłoka uruchomiła aplikację i nie zawiera żadnych zmian katalogu roboczego wykonanych przez samą aplikację (być może dlatego OP obserwuje takie zachowanie).

Więc pomyślałem, że dodam kilka innych sposobów, które powinny dać aktualny katalog roboczy (nie aplikacji binarny lokalizacja):

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

Dziękuję Mark, ale testowałem oba rozwiązania z Qt5.3.2 pod linuxem, i oba dają binarną lokalizację ... – Geoffroy

Powiązane problemy