QProcess 有两种用法模式:
- 一个是调用 start() 或 execute():此时被调用函数的标准输入、标准输出、标准出错 都已经被重定向到QProcess创建的相应的管道中。在这种情况下,即使你的控制台程序有自己的Console,那么它既不能接收任何输入,也不会输出任何内容。改进程的父进程还是咱们自己当前进程,因此,可以管控它。(因此也叫做可控模式)
那么,该模式下,如果期望能出现一个本该属于它的控制台窗口,就跟在dev c++等软件编译运行的结果那样,那需要怎么做呢:
加一句代码:
process1.setCreateProcessArgumentsModifier(
[](QProcess::CreateProcessArguments *args) {
args->flags |= CREATE_NEW_CONSOLE;
args->startupInfo->dwFlags &=~ STARTF_USESTDHANDLES;
});
原理:因为QProcess底层调用的是windows平台的底层库Win32 API 函数 CreateProcess() 来实现创建子进程的,而默认给CreateProcess()函数的参数中,就指明了不要出现控制台窗口,因此我们要想出现控制台窗口,就需要修改默认传给CreateProcess() 函数的参数,就是通过上面的函数实现的。
而且子进程会共用父进程的这个窗口设置属性,比如进程A设置采用显示控制台窗口的形式启动了进程B,输入给B的参数中又是进程C的路径,此时只会出现一个控制台窗口,也就是进程C的内容会显示在进程B的控制台窗口中。
示例代码:
QStringList arguments;
arguments;//
QProcess process1(this);
process1.setCreateProcessArgumentsModifier(
[](QProcess::CreateProcessArguments *args) {
args->flags |= CREATE_NEW_CONSOLE;
args->startupInfo->dwFlags &=~ STARTF_USESTDHANDLES;
});
process1.start("C:\\Users\\86132\\Documents\\panda_project\\test1.exe"/*,arguments*/);
process1.waitForStarted();
process1.waitForFinished();
参考文献:
QProcess调用外部程序不显示界面 - sagerking - 博客园
QProcess :: startDetached在启动cmd.exe外部程序没有弹出窗口_xinqingwuji的博客-程序员宝宝 - 程序员宝宝
Windows下令QProcess弹出CMD界面_Sudouble的博客-CSDN博客
- 另一个用法是,startDetached():这是QProcess启动你的控制台程序后,没有任何额外的操作,你也在当前程序中无法控制它(它是一个独立的进程了,父进程不是当前进程,因此无法管控它了)。不过,在Windows下,会有一个你期望的Console出现;在其他系统下,不会有终端显示出来。(不可控模式)
注:
- 一般在英文文档中,fine-tune表示微调的意思,比如参数微调
- passing it to表示将参数xx传递给xx,即传递,输入的意思
- custom color scheme,表示自定义配色方案,custom一般表示自定义,比如软件自定义安装选项
参考文献: