C++ 获取 Qt 应用程序中的当前工作目录
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/7402576/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Get current working directory in a Qt application
提问by Geoffroy
I'm writing a program in C++ using the Qt library. There is a symbolic link in my home bin directory to the executable. I would like the current working directory of my program to be the directory in which I am with my terminal (ie. the result of the pwd
command). I saw the QDir::currentPath()
function, but it gives back the directory where the binary is.
我正在使用 Qt 库用 C++ 编写程序。我的主 bin 目录中有一个指向可执行文件的符号链接。我希望我的程序的当前工作目录是我的终端所在的目录(即pwd
命令的结果)。我看到了这个QDir::currentPath()
函数,但它返回了二进制文件所在的目录。
How can I find my current working directory?
如何找到我当前的工作目录?
采纳答案by Geoffroy
Thank you RedX and Kaz for your answers. I don't get why by me it gives the path of the exe. I found an other way to do it :
感谢 RedX 和 Kaz 的回答。我不明白为什么我会给出exe的路径。我找到了另一种方法:
QString pwd("");
char * PWD;
PWD = getenv ("PWD");
pwd.append(PWD);
cout << "Working directory : " << pwd << flush;
It is less elegant than a single line... but it works for me.
它不如单行优雅......但它对我有用。
回答by RedX
Just tested and QDir::currentPath()
does return the path from which I called my executable.
刚刚测试并QDir::currentPath()
返回了我调用可执行文件的路径。
And a symlink does not "exist". If you are executing an exe from that path you are effectively executing it from the path the symlink points to.
并且符号链接不“存在”。如果您从该路径执行 exe,您实际上是从符号链接指向的路径执行它。
回答by KaZ
Have you tried QCoreApplication::applicationDirPath()
你有没有试过QCoreApplication::applicationDirPath()
qDebug() << "App path : " << qApp->applicationDirPath();
回答by joseph
To add on to KaZ answer, Whenever I am making a QML application I tend to add this to the main c++
添加到 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();
}
Using it in QML
在 QML 中使用它
....
........
............
Text{
text:"This is the applications path: " + appPath
+ "\nThis is the users home directory: " + homePath
+ "\nThis is the Desktop path: " desktopPath;
}
回答by Mark Walker
I'm running Qt 5.5 under Windows and the default constructor of QDir appears to pick up the current working directory, not the application directory.
我在 Windows 下运行 Qt 5.5 并且 QDir 的默认构造函数似乎选择当前工作目录,而不是应用程序目录。
I'm not sure if the getenv PWD will work cross-platform and I think it is set to the current working directory when the shell launched the application and doesn't include any working directory changes done by the app itself (which might be why the OP is seeing this behavior).
我不确定 getenv PWD 是否可以跨平台工作,我认为它在 shell 启动应用程序时设置为当前工作目录,并且不包括应用程序本身所做的任何工作目录更改(这可能是为什么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;