在Qt应用程序中获取当前工作目录
Get current working directory in a Qt application
我正在使用Qt库用c++编写程序。在我的主bin目录中有一个到可执行文件的符号链接。我希望我的程序的当前工作目录是我在我的终端目录(即。pwd
命令的执行结果)。我看到了QDir::currentPath()
函数,但是它返回了二进制文件所在的目录。
如何找到我当前的工作目录?
刚刚测试过,QDir::currentPath()
确实返回了我调用可执行文件的路径。
符号链接不"存在"。如果你从那个路径执行一个exe,你实际上是从符号链接指向的路径执行它。
您是否尝试过QCoreApplication::applicationDirPath()
qDebug() << "App path : " << qApp->applicationDirPath();
为了补充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;
}
感谢RedX和Kaz的回答。我不明白为什么我给出了exe的路径。我发现了另一种方法:
QString pwd("");
char * PWD;
PWD = getenv ("PWD");
pwd.append(PWD);
cout << "Working directory : " << pwd << flush;
它没有一行那么优雅…
我在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;
相关文章:
- 获取当前正在运行的 exe 名称(不是路径)
- 如何在QGridLayout中获取QComboBox的当前文本?
- C++17:如何在并行 STL 中获取工作项的索引
- 如何以" Safe "的方式获取 C++ 中的当前时间
- 如何获取当前用户的默认RAS电话簿路径?
- 获取当前密钥状态?
- C++程序以获取当前时间
- 如何在 unix 中获取当前工作目录中最大的文件
- 如何获取 c++ 文件的当前工作目录
- 当前工作目录中的文件I/O会失败吗
- 更改当前工作目录 VS13?
- 获取当前工作目录的相对路径,而不是绝对路径
- 为什么 g++ -MM 选项忽略当前工作目录的包含文件
- 如何在Windows中为当前用户获取库文件夹列表
- 如何在不破坏当前工作代码的情况下添加小数
- 如何更改当前工作目录
- 猫鼬网络服务器获取当前工作线程
- c++头文件的当前工作目录
- 在Qt应用程序中获取当前工作目录
- VSPackage使用C++,如何在visual studio中获取当前工作项目的目录