我正在用C++編寫一個使用Qt庫的程序。在我的主目錄bin目錄中有一個符號鏈接給可執行文件。我希望我的程序的當前工作目錄是我在終端中的目錄(即pwd
命令的結果)。我看到QDir::currentPath()
函數,但它返回二進制文件所在的目錄。在Qt應用程序中獲取當前工作目錄
如何找到我目前的工作目錄?
我正在用C++編寫一個使用Qt庫的程序。在我的主目錄bin目錄中有一個符號鏈接給可執行文件。我希望我的程序的當前工作目錄是我在終端中的目錄(即pwd
命令的結果)。我看到QDir::currentPath()
函數,但它返回二進制文件所在的目錄。在Qt應用程序中獲取當前工作目錄
如何找到我目前的工作目錄?
謝謝RedX和卡茲你的答案。我不明白爲什麼我會給出exe的路徑。我發現了另一種方式來做到這一點:
QString pwd("");
char * PWD;
PWD = getenv ("PWD");
pwd.append(PWD);
cout << "Working directory : " << pwd << flush;
它不如一條線優雅...但它適用於我。
我也用QFileInfo(「。」)。absolutePath() – crgarridos
剛剛測試過,並且QDir::currentPath()
的確返回了我調用我的可執行文件的路徑。
而且符號鏈接不存在。如果您正在從該路徑執行一個exe文件,您將有效地從符號鏈接指向的路徑執行它。
http://doc-snapshot.qt-project.org/4.8/qdir.html#currentPath –
你試過QCoreApplication::applicationDirPath()
qDebug() << "App path : " << qApp->applicationDirPath();
如果我閱讀文檔,這給出了可執行文件所在的目錄。但我想要從中調用可執行文件的目錄。 – Geoffroy
這通常會起作用,但不是每個人都會使用QCoreApplication。例如,我的QTest不會讓我使用它。 –
要添加到哈薩克斯坦的答案, 每當我想提出一個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;
}
現在有一個StandardPaths QML模塊:https://doc.qt.io/qt-5/qml-qt-labs-platform-standardpaths.html –
我跑在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;
感謝您馬克,但我已經在Linux下測試了您的解決方案與Qt5.3.2,並且都給出了二進制位置... – Geoffroy
請問一個QDir默認的構造函數給出相同的結果? – cmannett85
是的:'QDir dir; Cout << dir.absolutePath()<< flush;'給我可執行程序所在的目錄。 – Geoffroy
QDir :: currentPath()和dir.absolutePath()都返回命令行的當前目錄。 – Flint