定义

The QProcess class is used to start external programs and to communicate with them.

QProcess类是用来启动一个外部程序并与之通信。

使用说明

开启外部线程的3中方式

To start a process, pass the name and command line arguments of the program you want to run as arguments to start(). Arguments are supplied as individual strings in a QStringList.

Alternatively, you can set the program to run with setProgram() and setArguments(), and then call start() or open().

想要启动一个进程,可以传递你想启动的程序的名字和命令行参数作为参数传递给start()函数。参数作为QStringList中每一个单独的字符串。

或者,你可以通过setProgram()和setArguments()来设置该程序,然后调用start()或者open()启动该程序。

启动时在指定程序名时就附带上参数

QProcess process;
process.start("cmd /c ping 127.0.0.1");
  • 1
  • 2

启动时分别指定函数名和参数列表

QProcess process;
process.start("cmd", QStringList()<<"/c"<<"ping 127.0.0.1", QIODevice::ReadWrite);
  • 1
  • 2

分别指定函数名和参数,然后再启动

QProcess process;
process.setProgram("cmd");
process.setArguments(QStringList()<<"/c"<<"ping 127.0.0.1");
process.start(QIODevice::ReadWrite);
  • 1
  • 2
  • 3
  • 4

一次性读取进程输出

void readProcessAllOnce(bool processAutoExit) {qDebug()<<"readProcessAllOnce, processAutoExit ="<<processAutoExit;qDebug()<<"----------------------";bool ret;QProcess process;QString command;if(processAutoExit) {command = "cmd /c ping 127.0.0.1";} else {command = "cmd /k ping 127.0.0.1";}process.start(command);/** bool QProcess::waitForStarted(int msecs = 30000)*/ret = process.waitForStarted();qDebug()<<"waitForStarted"<<ret;qDebug()<<QDateTime::currentDateTime();/** 如果打开的不是自动关闭的进程,那么这里最多可能会等待30秒* bool QProcess::waitForFinished(int msecs = 30000)*/ret = process.waitForFinished();qDebug()<<QDateTime::currentDateTime();qDebug()<<"waitForFinished"<<ret;QByteArray byteArray = process.readAllStandardOutput();QString str = QString::fromLocal8Bit(byteArray);qDebug()<<str;process.close();qDebug()<<"";qDebug()<<"======================";
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

按行读取进程输出

void readProcessByLine() {qDebug()<<"readProcessByLine";qDebug()<<"----------------------";bool ret;QProcess process(0);/** cmd /c 的命令执行完后会关闭窗口* cmd /k 的命令执行完后不会关闭窗口** aa && bb 就是执行aa,成功后再执行bb* aa || bb 先执行aa,若执行成功则不再执行bb,若失败则执行bb* a  &  b  表示执行a再执行b,而无论a是否成功*/process.start("cmd", QStringList()<<"/k"<<"ping 127.0.0.1"<<"&"<<"exit", QIODevice::ReadWrite);
//    process.setProgram("cmd");
//    process.setArguments(QStringList()<<"/k"<<"ping 127.0.0.1"<<"&"<<"exit");
//    process.start(QIODevice::ReadWrite);ret = process.waitForStarted();qDebug()<<"waitForStarted"<<ret;qint64 maxSize = 512;char buffer[maxSize];qint64 len;while(true) {/** 一个waitForReadyRead信号可能输出的是多行*/ret = process.waitForReadyRead();qDebug()<<"waitForReadyRead"<<ret;if(!ret) {break;}while(true) {len = process.readLine(buffer, maxSize);qDebug()<<"buffer len"<<len;/** 因为每一行至少还有回车换行符,因此读到0,说明waitForReadyRead超时返回false*/if(len <= 0) {break;}QString str = QString::fromLocal8Bit(buffer);qDebug()<<"qstring len"<<str.length();qDebug()<<str;qDebug()<<"";}}process.write("exit\r\n");ret = process.waitForFinished();qDebug()<<"waitForFinished"<<ret;process.close();qDebug()<<"";qDebug()<<"======================";
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

与进程交互

void openProcessThenWrite() {qDebug()<<"openProcessThenWrite";qDebug()<<"----------------------";bool ret;QProcess *process = new QProcess(QThread::currentThread());/** 如果没有QCoreApplication的话,会报如下错误* QObject::startTimer: Timers can only be used with threads started with QThread. timer只能在同一个线程中创建和启动.*/process->start("cmd", QIODevice::ReadWrite);ret = process->waitForStarted();qDebug()<<"waitForReadyRead"<<ret;QByteArray byteArray = process->readAllStandardOutput();QString str = QString::fromLocal8Bit(byteArray);qDebug()<<str;//这里不加换行的话命令发不出去qint64 len = process->write("ping 127.0.0.1\r\nexit\r\n");qDebug()<<"write len"<<len;while(true) {/** 如果进程已经关闭,waitForReadyRead会直接返回false*/ret = process->waitForReadyRead();qDebug()<<"waitForReadyRead"<<ret;if(!ret) {break;}byteArray = process->readAllStandardOutput();str = QString::fromLocal8Bit(byteArray);qDebug()<<str;qDebug()<<"";}/** 如果没有关闭cmd的指令,因此该process永远不会finished,会超时(30秒)返回false*/ret = process->waitForFinished();qDebug()<<"waitForFinished"<<ret;process->close();delete process;qDebug()<<"";qDebug()<<"======================";
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

测试函数

#include <QCoreApplication>
#include <QDebug>
#include <QProcess>
#include <QThread>
#include <QDateTime>void readProcessAllOnce(bool processAutoExit) {……
}void readProcessByLine() {……
}void openProcessThenWrite() {……
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);qDebug()<<"======================";readProcessAllOnce(false);readProcessAllOnce(true);readProcessByLine();openProcessThenWrite();qDebug()<<"That's all";return a.exec();
}

Qt 进程 QProcess相关推荐

  1. 【Qt】QProcess的使用总结

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

  2. Qt之Qprocess

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

  3. QT 关于QProcess的一些总结

    QProcess 常被用来启动外部程序,并且可以与之进行通讯.本文总结了开发过程中,QProcess的常用操作,部分内容借鉴网上. QProcess启动外部程序,并获取其输出信息 首先新建一个外部程序 ...

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

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

  5. Qt通过QProcess启动进程并传递命令行参数

    目录 QProcess 启动外部程序的两种方式 依赖式 分离式: 启动进程前的预处理 设置启动路径 设置启动命令参数 启动的状态 更多说明 Public Functions Signals 设计一个拉 ...

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

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

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

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

  8. Qt使用QProcess进程间双向通信(linux和win系统)

    文章目录 监听效果图 前言 QProcess 猜想实现 实例验证(Linux系统实现) 问题分析 代码实现 Win系统子进程监听实现 题外话 qprocess 如何关闭子进程 监听效果图 前言 最近需 ...

  9. Qt笔记-QProcess带管道符号运行及获取进程启动时间(Linux)

    这里不能用直接写到QProcess中start中的command参数. 比如这样的shell: ps -eo pid,lstart | grep 1808 采用这样的方式: QProcess p; p ...

最新文章

  1. VALSE 2020来了!60位计算机视觉、模式识别领域的优秀青年学者齐聚一堂
  2. matlab如何创建table,MATLAB table数据结构 首篇
  3. 如何搭建SVN的服务器
  4. 苹果支付:如何解决沙盒环境下获取可恢复购买项为空
  5. 企业级 SpringCloud 教程 (七) 高可用的分布式配置中心(Spring Cloud Config)
  6. 运算符重载——左移运算符重载
  7. c语言环境变量win10,设置系统环境变量是干嘛的?教你在哪设置win10环境变量
  8. 计算机视觉(三)——人脸识别
  9. 设计模式(五)Prototype Pattern
  10. 三款免费实用的本地文件夹同步/备份软件推荐 (SyncToy/FreeFileSync/Compare Advance)
  11. 如何理解失效模式与影响分析(FMEA)
  12. 天正CAD启动时显示服务器名称为空,如何解决天正建筑2014启动时出现error
  13. Git GUI中文乱码解决问题
  14. USGS官网批量下载卫星数据方法
  15. mysql 关闭远程_禁止MySQL root远程访问
  16. 实现轮播模拟点击事件
  17. 维修上门预约系统简单讲
  18. PHP防花生日记官网源码【前后端分离】源码
  19. git pull常见操作
  20. SecureCRT标签显示IP地址

热门文章

  1. 这大概是一篇最简单最清晰的Java JVM执行流程
  2. Go: 字符串比较的三种方法
  3. 基于linux的java学习,Java学习---Linux总结
  4. java在网页填写集数据,java网页数据采集(中篇-数据存储)
  5. 刚刚,华为云挂了。。。
  6. flutter可视化_Flutter 对Dart情有独钟的那些事儿
  7. ML之XGBoost:利用XGBoost算法对波士顿数据集回归预测(模型调参【2种方法,ShuffleSplit+GridSearchCV、TimeSeriesSplitGSCV】、模型评估)
  8. DL之Attention-ED:基于TF NMT利用带有Attention的 ED模型训练、测试(中英文平行语料库)实现将英文翻译为中文的LSTM翻译模型过程全记录
  9. 成功解决AttributeError: 'DataFrame' object has no attribute 'tolist'
  10. Interview:算法岗位面试—11.05下午上海某银行信息(总行,四大行之一)技术岗笔试记录