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"
Другие вопросы по тегам