QT 关于QProcess的一些总结
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);
- <1>
根据进程名字杀掉进程
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的一些总结相关推荐
- Qt之Qprocess
Qt之Qprocess 启动外部程序的两种方式 启动之前需要做的工作 启动状态 QProcess与QIODevice 交互 同步API QProcess进程类 进程的标准输出: QProcess 可用 ...
- Qt之QProcess(一)运行cmd命令
Qt提供了QProcess类,QProcess可用于完毕启动外部程序,并与之交互通信. 一.启动外部程序的两种方式: (1)一体式:void QProcess::start(const QString ...
- Qt笔记-QProcess切换用户执行进程(Linux)
如下命令: /bin/su cff -c "/bin/ping 127.0.0.1" 运行截图如下: 在Qt里面使用QProcess,不需要那个双引号,如下代码: #include ...
- Qt工作笔记-使用Qt中QProcess与iostream中system调用外部进程
目录 基础概念 演示 基础概念 Qt中的QProcess类可以调用外部程序! 同时iostream有个函数system也可以调用外部程序!这个system也是Windows,Linux上通用的 演示 ...
- Qt用QProcess调用exe的简单方法
Qt调用exe的简单方法: 1.找到exe的路径(注意,路径最好全是英文,无空格) 2.调用此exe 简单启动: QProcess pro; 1.带参数(参数具体意义请百度) pro.startDet ...
- Qt扫盲-QProcess理论总结
QProcess理论使用总结 一.概述 二.使用 三.通过 Channel 通道通信 四.同步进程API 五.注意事项 1. 平台特性 2. 不能实时读取 一.概述 QProcess 其实更多的是与外 ...
- 关于Qt的QProcess进程间双向通信
文章目录 前言 一.QProceess简介 二.实例 1.进程A(主进程) 2.进程B 3.运行 总结 前言 Qprocess作为Qt的进程通信类,在程序中的应用还是挺多的,不管是启动一个命令行,还是 ...
- 使用QT的QProcess执行cmd命令【记录】
由于工作需求,要使用QT执行cmd命令.鉴于网上的方法实现了适合自己的一种方法. 先放效果图 QProcess Class 可用于完成启动外部程序,并与之交互通信. 创建并启动 在 QProcess ...
- QT中QProcess调用命令行的痛苦经历
在QT程序中需要将某些目录和文件压缩为一个rar的压缩包,于是想到了在QT中通过QProcess类调用命令行的rar.exe来达到效果,但是没想到QProcess类用起来很麻烦,而且达不到效果,折腾了 ...
- 【Qt】QProcess的使用总结
引言 随着需求的更新.程序的逐渐壮大,现在需要在应用程序中调用外部编译器,执行相关指令并获得结果. 由于Qt中使用的是C++语言,自然可以调用system去执行相关指令,但是在使用过程中发生了乱码,导 ...
最新文章
- .net core 微服务_.NET 微服务实战之负载均衡(上)
- Java Date Time 教程
- selenium webdirver之ruby-开发ide安装
- 请不要更多的基本情节
- 2014 java面试题_2014 java面试题 (答案)
- 老司机 iOS 周报 #67 | 2019-05-13
- 利用深度学习从大脑活动合成语言,应对人类语音挑战
- linux 两台设备网桥配置6,linux2.6内核网桥分析
- 汇率换算(android安卓版)
- 系统漏洞解析含flag
- 健身管理系统【管理员添加,删除,个人信息,项目】
- vant vant-list碰到的坑
- 推荐7款国产的在线HTML编辑器
- vue移动端实现excel在线预览
- Micropython——关于I2C和SoftI2C以及SPI和SoftSPI的区别
- iphone与android共享位置,苹果手机,相互始终共享位置了以后,查看不了对方的位置...
- FCOS:Fully Convolutional One-Stage Object Detection 论文翻译(非解读)
- 百度SEO花生壳动态域名解析软件 v5.3.0.34889
- java计算机毕业设计ssm拼团旅游系统(源码+系统+mysql数据库+Lw文档)
- 艺术摄影--数码单反相机的基本操作和使用(2学时)--SDUST