添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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

terminate(),区别于 kill() 这种暴力的退出不同,它在退出进程的时候是有机会提示用户输入任何为保存的文件等。进程的输出通道与QProcess的读取通道相对应,⽽进程的输⼊通道与QProcess的写⼊通道相对应。这是因为我们使⽤QProcess读取的内容是进程的输出,⽽我们编写的内容则成为进程的输⼊。调⽤start()函数或open()函数启动进程。以分离的方式启动外部程序,外部程序与主程序互不干扰,外部进程的父进程是。的方式启动外部程序,外部进程与主程序互不干扰,但外部进程的父进程就是。 编写一个控制台应用程序,放到CMD中可以运行。 研究了快一下午,来回看了QProcess文档中,关于start、execute、statedDetached相关程序的说明。但通过在被调用程序中插入cout的打印输出观察后,发现运行的程序都是在父进程的cmd中运行。 使用方法 QProcess文档中有一段关于如下函数原型的描述。大意是说明在Windows平台下,QProcess的实现依靠于CreateProcess API,Qt对其进行了封装,如果需要更细粒度的控制,可以使用CreateProc QProcess可以用于启动外部程序,具有两种方式。 一体式:QProcess::start 方法。 外部程序启动后,将随主程序的退出而退出。 貌似要使用QProcess的close方法才可以关闭启动的外部程序。 分离式:QProcess::startDetached 方法。 外部程序启动后,当主程序退出时并不退出,而是继续运行。 2:当主进程关闭时,被调用的QTcpClientTest.exe 是随着主进程一起退出。3:主进程发送的参数,被调用的QTcpClientTest.exe 依然可以接受。3:主进程发送的参数,被调用的QTcpClientTest.exe 可以接受参数。(1.1)分离式:外部程序启动程序后,主程序退出时,被调用的进程继续执行,不退出。1:使用了startDetached来启动进程,信号都是无效的,接受不到任何消息。2:当主进程关闭时,被调用的QTcpClientTest.exe 是不会退出的。 可用于完成启动外部程序,并与之交互通信。 一、启动外部程序的两种方式   1)一体式:void QProcess::start(const QString & program,const QStringList &arguments,OpenMode mode = ReadWrite)     外部程序启动后,将随主程序的退出而退出 进程的概念 进程是操作系统里的一个概念,所谓进程就是程序执行的时候,会产生程序调度,数据处理等过程,因此一个程序会有多个进程,每个进程有自己独立的数据空间,以允许同时有多位用户执行同一程序,却不会相冲突。 所以引申出一些其他的概念。 进程在执行时,状态(state)会改变。所谓状态,就是指进程目前的动作: 新生(new):进程新产生中。 执行(running):正在执行。 等待(waiting):等待某事发生,例如等待用户输入完成。亦称“阻塞”(blocked) 就绪(ready):排班中,等待CP Qt提供了QProcess类,QProcess可用于完毕启动外部程序,并与之交互通信。一、启动外部程序的两种方式:(1)一体式:void QProcess::start(const QString & program, const QStringList & arguments, OpenMode mode = ReadWrite)外部程序启动后。将随主程序的退出而退出。 QProcess启动子进程后,主进程关闭会带着子进程一起关闭,但是如果通过startDetached启动子进程写入的数据将读取不到,大概如此,网络中还包含子进程使用QSocketNotifier关联数据读取,我个人并未尝试成功,后期打算再尝试一下。 QProcess 常被用来启动外部程序,并且可以与之进行通讯。本文总结了开发过程中,QProcess的常用操作,部分内容借鉴网上。 QProcess启动外部程序,并获取其输出信息 首先新建一个外部程序(QtConsole.exe),供QProcess调起使用,其代码如下: #include <QtCore/QCoreApplication> #include <QDebug> #include <iostream> int main(int argc, char *ar