我有一些像这样的代码:
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();
会返回" Sessions" Dir,而不是主要的可执行文件Dir,因为它应该在第一次运行时恢复。实际上,我确实设法通过在代码的biginning中添加一行来克服这个问题,如下:
QDir::setCurrent(QCoreApplication::applicationDirPath());
我仍然想知道为什么第一个代码没有工作。已经检查了函数的文档并且什么都没找到。
答案 0 :(得分:0)
我尝试使用以下代码,它适用于多次运行。 Qt和OS的版本细节可能有所帮助。
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"
答案 1 :(得分:0)
QDir :: current(); //这应该返回主可执行文件目录
不,不应该!除非您先将其改为指向那里,否则不会。
当我说出这句话时,我会非常认真:你的是一个神话,幻想,无论你怎么称呼它,我都不知道是什么给了你这个想法。指出我一个说明的规范。哦,你不能,因为没有这样的规范,没有这样的要求。它是某个人的暮光之城海市蜃楼,似乎无休止地延续下去。如果你是从别人那里听到的,那么你现在就有权对他们生气,因为他们给你带来了很大的伤害。
一般来说,对于通常不从命令行启动的应用程序,初始工作目录可以是任何,它将是platform- 和< / em>会话/系统配置依赖。对于典型的GUI应用程序,假设任何特定的初始工作目录是一个愚蠢的错误并且完全被误导。
将其更改为您希望指向的位置后,您当然可以完全控制它,但初始工作目录必须假定为随机且不在您的控制强>
例如,在Windows上,我可以通过资源管理器快捷方式启动应用程序,我可以在其中指定我想要的任何启动文件夹,并且您可以零控制它。在OS X上,Finder将工作目录设置为某个或另一个,IIRC到应用程序包所在的文件夹。同样,作为开发人员,您无法控制它,除非您可以添加到该效果中的某些设置,但这是特定于平台的,如果您的应用程序未通过Finder或捆绑包启动,则会被忽略API机制(它们可能被称为其他东西)。等等。它完全是武断的,依赖于它的初始值是毫无意义的。
如果要引用应用程序的安装目录或可执行目录,请明确执行此操作。 不要假设有关GUI应用程序的初始工作目录的任何内容。