关于QProcess的使用问题解释

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一般表示自定义,比如软件自定义安装选项

参考文献:

Qt之:QProcess使用总结_壁立千仞无欲则刚的博客-CSDN博客_qprocess

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值