Qt QDir::current()
У меня был какой-то код, подобный этому:
void MainWindow::saveData()
{
QDir oldDir=QDir::current();//this should return the main executable directory.Since there is no other place in my hole code where i temper with QDir.
QDir sess("Sessions");
if(!oldDir.exists("Sessions"))//if "Sessions" Dir doesn't exist
oldDir.mkdir("Sessions");//create it.
QDir::setCurrent(sess.absolutePath());
//some virtual code inside current Dir, which i didn't implement yet.
QDir::setCurrent(oldDir.absolutePath());//restore old dir
}
Когда я сначала запускаю свое приложение, код работает отлично. Но во втором запуске первый вызов QDir::current();
возвращает Dir "Sessions", а не основной исполняемый Dir, поскольку он должен быть восстановлен при первом запуске. На самом деле мне удалось преодолеть это, добавив одну строку в biginning кода, следующее:
QDir::setCurrent(QCoreApplication::applicationDirPath());
Тем не менее, я хочу знать, почему первый код не работал. Уже проверил документацию функций и ничего не нашел.
2 ответа
QDir::current();// это должно вернуть основной исполняемый каталог
Нет, не должно! Нет, если вы не измените его, чтобы указать там первым.
Я очень серьезен, когда скажу: " Это миф, фантазия, как бы вы это ни называли, я понятия не имею, что дало вам эту идею. Укажи мне на спецификацию, которая так говорит. О, вы не можете, потому что нет такой спецификации, нет такого требования. Это чей-то сумеречный часовой мираж, который кажется бесконечным. Если вы слышали это от кого-то, вы имеете полное право злиться на них в тот самый момент, потому что они оказали вам большую медвежью услугу.
Вообще говоря, для приложений, которые обычно не запускаются из командной строки, начальный рабочий каталог может быть любым, и он будет зависеть от конфигурации платформы и сеанса / системы. Для типичного приложения с графическим интерфейсом предполагается, что любой конкретный начальный рабочий каталог является дурацким поручением и полностью ошибочен.
Как только вы измените его на то место, на которое хотите указать, вы, конечно, получите полный контроль над ним, но исходный рабочий каталог должен быть случайным и не зависящим от вас.
Например, в Windows я могу запустить ваше приложение с помощью ярлыка Explorer, где я могу указать любую папку автозагрузки, какую захочу, и у вас нет контроля над ней. На OS X Finder устанавливает рабочий каталог на тот или иной, IIRC на папку, в которой находится комплект приложений. Опять же, вы, как разработчик, не можете контролировать его, если в пакете нет какой-либо настройки, которую вы могли бы добавить к этому эффекту, но это зависит от платформы и будет игнорироваться, если ваше приложение не запускается через механизмы Finder или API пакета (они наверное, называются что-то еще). И так далее. Это совершенно произвольно и бессмысленно зависеть от его первоначального значения.
Если вы хотите обратиться к каталогу установки приложения или каталогу исполняемых файлов, сделайте это явно. Не предполагайте ничего о начальном рабочем каталоге приложения с графическим интерфейсом.
Я попытался с приведенным ниже кодом, и он отлично работает для нескольких запусков. Сведения о версии Qt и ОС могут помочь.
Qt creator 3.3.2 (с открытым исходным кодом). Qt lib 5.4.1.Os windows 8.1
#include <QCoreApplication>
#include "QDir"
#include "qDebug"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QDir oldDir=QDir::current();
qDebug()<<QDir::current().absolutePath();
QDir sess("H:\\cuteapps\\session");
if(!oldDir.exists("H:\\cuteapps\\session"))//if "Sessions" Dir doesn't exist
oldDir.mkdir("H:\\cuteapps\\session");//create it.
QDir::setCurrent(sess.absolutePath());
qDebug()<<QDir::current().absolutePath();
return a.exec();
}
output 1:
"H:/cuteapps/build-untitled2-Desktop_Qt_5_4_1_MSVC2012_OpenGL_32bit-Debug"
"H:/cuteapps/session"
output 2:
"H:/cuteapps/build-untitled2-Desktop_Qt_5_4_1_MSVC2012_OpenGL_32bit-Debug"
"H:/cuteapps/session"
output 3:
"H:/cuteapps/build-untitled2-Desktop_Qt_5_4_1_MSVC2012_OpenGL_32bit-Debug"
"H:/cuteapps/session"