2011-09-13 145 views
55

我正在用C++編寫一個使用Qt庫的程序。在我的主目錄bin目錄中有一個符號鏈接給可執行文件。我希望我的程序的當前工作目錄是我在終端中的目錄(即pwd命令的結果)。我看到QDir::currentPath()函數,但它返回二進制文件所在的目錄。在Qt應用程序中獲取當前工作目錄

如何找到我目前的工作目錄?

+1

請問一個QDir默認的構造函數給出相同的結果? – cmannett85

+2

是的:'QDir dir; Cout << dir.absolutePath()<< flush;'給我可執行程序所在的目錄。 – Geoffroy

+1

QDir :: currentPath()和dir.absolutePath()都返回命令行的當前目錄。 – Flint

回答

2

謝謝RedX和卡茲你的答案。我不明白爲什麼我會給出exe的路徑。我發現了另一種方式來做到這一點:

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

它不如一條線優雅...但它適用於我。

+0

我也用QFileInfo(「。」)。absolutePath() – crgarridos

71

剛剛測試過,並且QDir::currentPath()的確返回了我調用我的可執行文件的路徑。

而且符號鏈接不存在。如果您正在從該路徑執行一個exe文件,您將有效地從符號鏈接指向的路徑執行它。

+0

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

39

你試過QCoreApplication::applicationDirPath()

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

如果我閱讀文檔,這給出了可執行文件所在的目錄。但我想要從中調用可執行文件的目錄。 – Geoffroy

+0

這通常會起作用,但不是每個人都會使用QCoreApplication。例如,我的QTest不會讓我使用它。 –

7

要添加到哈薩克斯坦的答案, 每當我想提出一個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; 
} 
+0

現在有一個StandardPaths QML模塊:https://doc.qt.io/qt-5/qml-qt-labs-platform-standardpaths.html –

2

我跑在Windows下的Qt 5.5和QDir的默認構造函數似乎選取當前工作目錄,而不是應用程序目錄。

我不確定getenv PWD是否可以跨平臺工作,並且我認爲它在shell啓動應用程序時設置爲當前工作目錄,並且不包括由應用程序本身完成的任何工作目錄更改這可能是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; 
+0

感謝您馬克,但我已經在Linux下測試了您的解決方案與Qt5.3.2,並且都給出了二進制位置... – Geoffroy