Получить текущий рабочий каталог в приложении Qt
Я пишу программу на С++, используя библиотеку Qt. В моем каталоге bin есть символическая ссылка для исполняемого файла. Я хотел бы, чтобы текущий рабочий каталог моей программы был каталогом, в котором я с моим терминалом (т.е. Результатом команды pwd
). Я видел функцию QDir::currentPath()
, но она возвращает каталог, в котором находится двоичный файл.
Как найти текущий рабочий каталог?
Ответы
Ответ 1
Спасибо RedX и Kaz за ваши ответы. Я не понимаю, почему именно это дает путь к exe. Я нашел другой способ сделать это:
QString pwd("");
char * PWD;
PWD = getenv ("PWD");
pwd.append(PWD);
cout << "Working directory : " << pwd << flush;
Он менее изящный, чем одна строка... но он работает для меня.
Ответ 2
Просто протестировано и QDir::currentPath()
возвращает путь, из которого я вызвал свой исполняемый файл.
И символическая ссылка не существует. Если вы выполняете exe с этого пути, вы эффективно выполняете его с пути, на который указывает ссылка на символику.
Ответ 3
Вы пробовали QCoreApplication:: applicationDirPath()
qDebug() << "App path : " << qApp->applicationDirPath();
Ответ 4
Чтобы добавить к ответу KaZ,
Всякий раз, когда я делаю приложение QML, я обычно добавляю его в основной С++
#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;
}
Ответ 5
Я запускаю Qt 5.5 под Windows, и конструктор по умолчанию QDir, по-видимому, забирает текущий рабочий каталог, а не каталог приложения.
Я не уверен, что getenv PWD будет работать межплатформенным, и я думаю, что он установлен в текущий рабочий каталог, когда оболочка запускает приложение и не включает какие-либо изменения в рабочем каталоге, выполненные самим приложением (который может быть, почему 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;