QProcess 常被用来启动外部程序,并且可以与之进行通讯。本文总结了开发过程中,QProcess的常用操作,部分内容借鉴网上。

QProcess启动外部程序,并获取其输出信息

首先新建一个外部程序(QtConsole.exe),供QProcess调起使用,其代码如下:

#include <QtCore/QCoreApplication>
#include <QDebug>
#include <iostream>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);std::cout << "------QtConsole's output------std::cout" << std::endl;QStringList arguments = QCoreApplication::arguments();for (auto v : arguments){std::cout << "arguments=" << v.toStdString().c_str() << std::endl;}std::cout << "------QtConsole's output------QDebug" << std::endl;for (auto v : arguments){qDebug() << "arguments=" << v;}//return a.exec();//system("pause");return 0;
}

使用execute或start启动外部程序,被调用函数的标准输入/输出/出错,都已被重定向到QProcess创建的相应的管道中。

  • execute 启动外部程序
    execute()是阻塞的,execute()=start()+waitforFinished()
  • start 启动外部程序
    start()是非阻塞的,调起的QtConsole.exe不会显示界面(只会存在于任务管理器的进程列表中)
    需要等到QtConsole.exe的进程结束,QProcess的readAll才能读取到QtConsole.exe中std::cout输出的内容
#include <QtCore/QCoreApplication>
#include <QProcess>
#include <QDebug>
#include <QObject>
#include <iostream>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QProcess* process = new QProcess;QObject::connect(process, &QProcess::started, [=](){qDebug() << "QProcess::started";});QObject::connect(process, &QProcess::readyRead, [=](){qDebug() << "readyRead-readAll:";qDebug() << QString::fromLocal8Bit(process->readAll());qDebug() << "readyRead-readAllStandardOutput:";qDebug() << QString::fromLocal8Bit(process->readAllStandardOutput());});QObject::connect(process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), [=](int exitCode, QProcess::ExitStatus exitStatus){//QProcess::ExitStatus(QProcess::NormalExit/CrashExit)qDebug() << "exitCode=" << exitCode << ", exitStatus=" << exitStatus;if (exitStatus == QProcess::NormalExit){qDebug() << "finished-readAll:";qDebug() << QString::fromLocal8Bit(process->readAll());qDebug() << "finished-readAllStandardOutput:";qDebug() << QString::fromLocal8Bit(process->readAllStandardOutput());}else if (exitStatus == QProcess::CrashExit){qDebug() << "QProcess::CrashExit";}else{qDebug() << "QProcess::???";}}); QObject::connect(process, &QProcess::stateChanged, [=](QProcess::ProcessState processState){//QProcess::ProcessState(QProcess::NotRunning/Starting/Running)//QProcess::ProcessState processState = process->state();qDebug() << "ProcessState=" << processState;});QObject::connect(process, &QProcess::errorOccurred, [=](QProcess::ProcessError processError){//QProcess::ProcessError(FailedToStart/Crashed/Timedout/ReadError/WriteError/UnknownError)qDebug() << "QProcess::ProcessError=" << processError;});//启动外部程序(QtConsole.exe)QString program = "QtConsole.exe";QStringList startArgs;startArgs << "gameName=Test" << "maxPlayer=3" << "minPlayer=1";/** execute()是阻塞的,execute()=start()+waitforFinished()* QtConsole.exe的输出(包括qDebug的输出)会显示在本进程的窗口显示*/process->execute(program, startArgs);/** start()是非阻塞的,调起的QtConsole.exe不会显示界面(只会存在于任务管理器的进程列表中)* 需要等到QtConsole.exe的进程结束, QProcess的readAll才能读取到QtConsole.exe中std::cout输出的内容*///process->start(program, startArgs);//process->waitForFinished();system("pause");return 0;
}

上述代码(process->execute(program, startArgs);)运行结果:

上述代码(process->start(program, startArgs); process->waitForFinished();)运行结果:

  • startDetached 启动外部程序

    • <1>

      QString cmdstr = "cmd.exe /c QtConsole.exe --path ./editor --game \"a b c\" --lang zh";
      QProcess::startDetached(cmdstr);
      
    • <2>
      qint64 pid = 0;
      QStringList param;
      param << "--path";
      param << "./editor";
      param << "--game";
      param << "\"a b c\"";
      param << "--lang";
      param << "--zh";
      QProcess::startDetached("QtConsole.exe", param, "", &pid);
      

根据进程名字杀掉进程

QProcess p;
QString cmd = "taskkill /im QtConsole.exe /f";
p.execute(cmd);
//p.start(cmd);
//p.waitForFinished();
p.close();

根据进程ID杀掉进程

QString strCommand = QString("taskkill /pid %1 /f").arg(pid);//<1>int code = system(strCommand.toStdString().c_str());qDebug() << "code=" << code;//<2>process->start(strCommand);//<3>code = process->execute(strCommand);qDebug() << "code=" << code;//0

start 与 startDetached 的区别

start是一体式的:外部程序启动后,将随主程序的退出而退出;
startDetached是分离式的:外部程序启动后,不会随主程序的退出而退出。
重要区别:如果是start则回调都可以正常接收到信息;如果是startDetached则回调无法正常接收到信息。

QT 关于QProcess的一些总结相关推荐

  1. Qt之Qprocess

    Qt之Qprocess 启动外部程序的两种方式 启动之前需要做的工作 启动状态 QProcess与QIODevice 交互 同步API QProcess进程类 进程的标准输出: QProcess 可用 ...

  2. Qt之QProcess(一)运行cmd命令

    Qt提供了QProcess类,QProcess可用于完毕启动外部程序,并与之交互通信. 一.启动外部程序的两种方式: (1)一体式:void QProcess::start(const QString ...

  3. Qt笔记-QProcess切换用户执行进程(Linux)

    如下命令: /bin/su cff -c "/bin/ping 127.0.0.1" 运行截图如下: 在Qt里面使用QProcess,不需要那个双引号,如下代码: #include ...

  4. Qt工作笔记-使用Qt中QProcess与iostream中system调用外部进程

    目录 基础概念 演示 基础概念 Qt中的QProcess类可以调用外部程序! 同时iostream有个函数system也可以调用外部程序!这个system也是Windows,Linux上通用的 演示 ...

  5. Qt用QProcess调用exe的简单方法

    Qt调用exe的简单方法: 1.找到exe的路径(注意,路径最好全是英文,无空格) 2.调用此exe 简单启动: QProcess pro; 1.带参数(参数具体意义请百度) pro.startDet ...

  6. Qt扫盲-QProcess理论总结

    QProcess理论使用总结 一.概述 二.使用 三.通过 Channel 通道通信 四.同步进程API 五.注意事项 1. 平台特性 2. 不能实时读取 一.概述 QProcess 其实更多的是与外 ...

  7. 关于Qt的QProcess进程间双向通信

    文章目录 前言 一.QProceess简介 二.实例 1.进程A(主进程) 2.进程B 3.运行 总结 前言 Qprocess作为Qt的进程通信类,在程序中的应用还是挺多的,不管是启动一个命令行,还是 ...

  8. 使用QT的QProcess执行cmd命令【记录】

    由于工作需求,要使用QT执行cmd命令.鉴于网上的方法实现了适合自己的一种方法. 先放效果图 QProcess Class 可用于完成启动外部程序,并与之交互通信. 创建并启动 在 QProcess ...

  9. QT中QProcess调用命令行的痛苦经历

    在QT程序中需要将某些目录和文件压缩为一个rar的压缩包,于是想到了在QT中通过QProcess类调用命令行的rar.exe来达到效果,但是没想到QProcess类用起来很麻烦,而且达不到效果,折腾了 ...

  10. 【Qt】QProcess的使用总结

    引言 随着需求的更新.程序的逐渐壮大,现在需要在应用程序中调用外部编译器,执行相关指令并获得结果. 由于Qt中使用的是C++语言,自然可以调用system去执行相关指令,但是在使用过程中发生了乱码,导 ...

最新文章

  1. .net core 微服务_.NET 微服务实战之负载均衡(上)
  2. Java Date Time 教程
  3. selenium webdirver之ruby-开发ide安装
  4. 请不要更多的基本情节
  5. 2014 java面试题_2014 java面试题 (答案)
  6. 老司机 iOS 周报 #67 | 2019-05-13
  7. 利用深度学习从大脑活动合成语言,应对人类语音挑战
  8. linux 两台设备网桥配置6,linux2.6内核网桥分析
  9. 汇率换算(android安卓版)
  10. 系统漏洞解析含flag
  11. 健身管理系统【管理员添加,删除,个人信息,项目】
  12. vant vant-list碰到的坑
  13. 推荐7款国产的在线HTML编辑器
  14. vue移动端实现excel在线预览
  15. Micropython——关于I2C和SoftI2C以及SPI和SoftSPI的区别
  16. iphone与android共享位置,苹果手机,相互始终共享位置了以后,查看不了对方的位置...
  17. FCOS:Fully Convolutional One-Stage Object Detection 论文翻译(非解读)
  18. 百度SEO花生壳动态域名解析软件 v5.3.0.34889
  19. java计算机毕业设计ssm拼团旅游系统(源码+系统+mysql数据库+Lw文档)
  20. 艺术摄影--数码单反相机的基本操作和使用(2学时)--SDUST

热门文章

  1. 编程之禅 -- 写给自己的话
  2. 如何利用微信公众平台达到品牌营销,网络推广三大关键
  3. WebUI自动化测试框架搭建(二)-详细设计框架设计
  4. 在Ubuntu 20.04上优雅的使用微信和QQ(基于deepin wine)
  5. Android 仿QQ侧滑菜单
  6. 图像语义分割(semantic segmentation)
  7. go channel原理及用法
  8. ATTCK实战系列 —— 红队实战(三)
  9. vulnstack红日-三
  10. Odoo看板视图实践案例