使用QT踩过的坑之 -QDir::currentPath()
QDir::currentPath()很容易被误用,而且不容易被发现。首先来看下QT官方对QDir::currentPath()的解释。
QString QDir::currentPath()
Returns the absolute path of the application’s current directory. The current directory is the last directory set with QDir::setCurrent() or, if that was never called, the directory at which this application was started at by the parent process.
上面的解释的意思是,QDir::currentPath返回的是应用的绝对路径,这个路径是上次通过QDir::setCurrent()设置的路径,或者如果QDir::setCurrent()这个目录从来没有被调用过,那个这个路径是启动它的父进程的路径。
所以如果不明所以的使用了这个API,会发生以下的几件匪夷所思,但是却十分合情合理的事情。
1)如果在QtCreator当中使用这个路径,然后通过QtCreator执行程序,它会返回的是源码的路径;这是因为QtCreator当前的路径是源码路径,而QtCreator又是编译出的执行文件的父进程,因此根据解释,此时的路径是源码的路径;
2)如果编译、打包完成之后,在打包文件夹当中,去执行这个程序,此时QDir::currentPath()代表的路径,又变成了可执行程序的路径;
3)同理,如果该程序被其它程序以进程的方式调用,此时QDir::currentPath()的路径也会变成父进程的路径,这会导致一些非常迷惑的行为,而这些错误又很难排查。
所以,如果编码人员不明所以的使用了该API去在程序当中导入一些配置文件路径或者资源文件的路径,此时在QtCreator直接编译运行或者被其它进程调用运行和这个程序自身双击运行,就会导致不同的行为。
所以,对于QT编写程序,配置资源文件的路径,建议使用的API为QCoreApplication::applicationDirPath(),这个API返回的路径是包含可执行程序的路径,这上面三种工况下均返回同一个路径。
如果使用了该路径,对应的资源文件、配置文件在QtCreator进行调用的时候,也应该拷贝到对应的含有可执行文件的编译文件夹当中,之后使用windeployqt进行一起打包,就好。