Qt QDir::current()

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
}

当我 运行 我的应用程序首先代码工作 perfectly.but 在第二个 运行,第一个调用 QDir::current(); returns "Sessions" Dir 而不是主要的可执行文件 Dir,因为它应该在第一个 run.actually 中恢复

QDir::setCurrent(QCoreApplication::applicationDirPath());

我还是想知道为什么第一个代码没有work.already检查函数的文档但什么也没找到。

我试过下面的代码,它运行了好几次。 Qt 和 OS 的版本详细信息可能会有所帮助。

Qt creator 3.3.2(开源)。 Qt 库 5.4.1.Oswindows8.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"

QDir::current();//this should return the main executable directory

不,不应该! 不,除非您先将其更改为指向那里。

当我这么说的时候我是认真的:你的是一个神话,幻想,不管你怎么称呼它,我不知道是什么给了你这个想法。 要点我的规格是这样说的。哦,你不能,因为没有这样的规范,没有这样的要求。这是某人的暮光之城海市蜃楼,似乎永无休止。如果你是从某人那里听到的,你现在完全有权利对他们生气,因为他们对你造成了很大的伤害。

一般而言,对于通常不从命令行启动的应用程序,初始工作目录可以是anything并且它将依赖于平台- session/system 配置。对于典型的 GUI 应用程序,假设任何特定的 initial 工作目录都是徒劳的,完全是错误的。

一旦您将它更改为您希望它指向的位置,您当然可以完全控制它,但必须假定 初始 工作目录 是随机的,不受你的控制.

例如,在 Windows 上,我可以通过资源管理器快捷方式启动您的应用程序,我可以在其中指定我想要的任何启动文件夹,并且您可以 zero 控制它.在 OS X 上,Finder 将工作目录设置为某个目录,IIRC 将其设置为应用程序包所在的文件夹。同样,作为开发人员,您无法控制它,除非捆绑包中有一些您可以添加到该效果的设置,但这是特定于平台的,如果您的应用程序不是通过 Finder 或捆绑包启动的,它将被忽略 API 机制(它们可能被称为其他东西)。等等。它完全是任意的,依赖于它的初始值是没有意义的。

如果您想引用应用程序的安装目录或可执行目录,请显式执行。 不要假设任何有关 GUI 应用程序初始工作目录的信息。