Qt如何指定QProcess运行程序的工作目录

参考资料:这里

Qt中使用QProcess构造进程对象来启动一个程序是很常见的事情。然而有时我们要启动的程序的设计人士在设计时处理路径会有一些不同的思路,这也就导致了一些程序必须在它所处的路径下被启动方可正常运行,否则就可能会引发一些问题。我不知道应该怎么专业地描述这个问题,但是简单来说,就是有时我们需要先cd到某个程序的目录再启动这个程序它方可正常运行。要是直接输入绝对路径去启动这个程序就可能引发报错。

那么,QProcess如何在这种状况下正确启动一个程序呢?也就是说,QProcess要怎么做,才可以先“cd”到这个程序的目录下再启动它呢?

做法很简单,QProcess支持设置要启动的程序的工作目录。语法是一个函数setWorkingDirectory

然而,使用它有一些说法。我们必须先把这个对象设定好要执行的程序,再设定工作目录,再去启动。以启动abc.exe为例,看例子就很明白了:

//正确做法:
QProcess abcProcess;	//创建QProcess对象
abcProcess.setProgram("C:/a/b/c/abc.exe");	//先指定要运行的程序
abcProcess.setWorkingDirectory("C:/a/b/c");	//再设定工作目录
abcProcess.start();	//最后再启动它

很多时候我们会犯这样的错误:

QProcess abcProcess;
abcProcess.setWorkingDirectory("C:/a/b/c");
abcProcess.start("abc.exe")

先设定工作目录再启动指定的程序,则设定的工作目录不会生效

至于为什么,我参考原资料的说法,推测感觉这可能和已弃用的语法有关。据Qt的文档,我们可以看到Qt似乎开始要求start的参数必须同时传递程序名和参数才行了,这个两个参数的start函数才是新语法。而如上文我们所看到的只要求一个程序名当参数的start是旧语法了,而这一旧语法似乎不兼容setWorkingDirectory,故不会去看工作目录。可能问题出在这里。如果我们只传程序名,Qt似乎建议还是先setProgram再直接start()为好。仅猜测如此。如有大佬知道详情,还请指正。

posted @ 2023-09-10 04:21  IZWB-003  阅读(846)  评论(0编辑  收藏  举报