在 Qt 应用程序中获取当前工作目录

我正在使用 Qt 库用 C + + 编写一个程序。在我的 home bin 目录中有一个指向可执行文件的符号链接。我希望我的程序的当前工作目录是我使用终端的目录(即。pwd命令的结果)。我看到了 QDir::currentPath()函数,但它返回了二进制文件所在的目录。

我怎样才能找到我现在的工作目录?

182833 次浏览

刚刚测试过,QDir::currentPath()确实返回了我调用可执行文件的路径。

符号链接并不“存在”。如果从该路径执行 exe,则实际上是从符号链接指向的路径执行它。

您是否尝试过 < a href = “ http://doc.qt.io/qt-4.8/QCoreApplication.html # applicationDirPath”rel = “ noReferrer”> QCoreApplication: : applicationDirPath ()

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

谢谢 RedX 和 Kaz 的回答。我不明白为什么我会有前任的路径。我找到了另一种方法:

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

虽然不如一条线那么优雅,但对我很有用。

再加上 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;
}

我在 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;