Qt输入输出之QProcess

Qt提供了一个QProcess类用于启动外部程序并与之通信。这个类是异步工作的,而且在后台执行,这样用户界面就可以始终保持响应。启动一个新的进程的操作非常简单,只需要将待启动的程序名称和启动参数传递给start()函数即可。

例如:

QObject *parent;

QString program = "tar"

QStringList arguments;

arguments << "czvf" << "backup.tar.gz" << "/home";

QProcess *myProcess = new QProcess(parent);

QProcess->start(program, arguments);

(1) 当调用start()函数后,myProcess进程立即进入启动状态,但tar程序尚未被调用,不能读写标准输入输出设备。

(2) 当进程完成启动后就进入"运行状态"并向外发出started()信号。在输入输出方面,QProcess将一个进程看做一个流类型的I/O设备,可以像使用QTcpSocket读写流类型的网络连接一样来读写一个进程。可以通过QIODevice::write()函数向所启动进程的标准输入写数据,也可以通过QIODevice::readAll()、QIODevice::readLine()和QIODevice::getChar()函数从这个进程的标准输出读数据。此外由于QProcess是从QIODevice类继承而来的,因此,它也可以作为QXmlReader的数据在源,或者为QFtp产生上传数据。

(3) 最后,当进程退出时QProcess进入起始状态----"非运行状态",并发出finished()信号。

void finished(int exitCode, QProcess::ExitStatus exitStatus)

信号在参数中返回了进程退出的退出码和退出状态,可以调用exitCode()函数和exitStatus()函数分别获取最后退出进程的这两个值。其中,Qt定义的进程"退出状态"只有正常退出和进程崩溃两种,分别对应值QProcess::NormalExit(值0)和QProcess::CrashExit(值1)。当进程在运行中产生错误时,QProcess将发出error()信号,可以通过,调用error()函数返回最后一次产生错误的类型,并通过state()找出此时进程所处的状态。

Qt定义了如下的进程错误代码:

错误常量                                    值      描述

QProcess::FailedToStart                 0            进程启动失败

QProcess::Crashed                         1            进程成功启动后崩溃

QProcess::Timedout                       2            最后一次调用waitFor...()函数超时.此时QProcess状态不变,并可以再次调用waitFor()类型的函数

QProcess::WriteError                     3            向进程写入时出错.如进程尚未启动,或者输入通道被关闭时

QProcess::ReadError                      4            从进程中读取数据时出错.如进程尚未启动时

QProcess::UnknownError              5            未知错误.这也是error()函数返回的默认值

进程的标准输出:

stdout:通常用于控制台下输出

stderr:通常用于进程打印错误

它们本质上是两个独立的数据流。

可以通过调用setReadChanned()函数设置当前的读通道。

当有可读数据时Qt将发出readyRead()信号。

如果是标准输出和标准错误通道中读取数据,还会发出readyReadStandardOutput()信号。

如果是标准错误也会发出readyReadStandardError()信号。

readAllStandardOutput()函数从标准输出通道中读取数据。

readAllStandardErrot()函数从标准错误通道中读取数据。

在进程启动以前以MergedChannels参数调用setReadChannelMode()函数可以把标准输出通道和标准输错误通道合并。例如:

#include <QApplication>

#include <QProcess>

#include <QString>

#include <iostream>

int main(int argc, char *argv[])

{

QApplication app(argc, argv);

QProcess proc;

QStringList arguments;

arguments << "-na";

proc.start("netstat", arguments);

// 等待进程启动

if (!proc.waitForStarted())

{

std::cout << "启动失败\n";

return false;

}

// 关闭写通道,因为没有向进程写数据,没用到

proc.closeWriteChannel();

// 用于保存进程的控制台输出

QByteArray procOutput;

// 等待进程结束

while (false == proc.waitForFinished())

{

;

}

// 读取进程输出到控制台的数据

procOutput = proc.readAll();

// 输出读到的数据

std::cout << procOutput.data() << std::endl;

// 返回

return EXIT_SUCCESS;

}

Qt输入输出之QProcess相关推荐

  1. QT输入输出(四)之 QProcess

    QProcess Qt提供了一个QProcess类用于启动外部程序并与之通信.这个类是异步工作的,而且在后台执行,这样用户界面就可以始终保持响应. 启动一个新的进程的操作非常简单,只需要将待启动的程序 ...

  2. 【Qt】使用QProcess调用其它程序或脚本

    [Qt]使用QProcess调用其它程序或脚本 大概试了一下,还是不错的,不过字符编码问题还不太好解决: 代码: #include "mainwindow.h" #include ...

  3. Qt QT的I/O流 QT输入输出

    1. QFile QDataStream 读写文件  二进制读写文件 #include <QApplication> #include <QtGui> #include < ...

  4. qprocess qt 打开word_Qt QProcess启动和关闭外部程序

    //适用于关闭后台进程的方法 QString c = "taskkill /im notepad.exe /f"; int pInt = QProcess::execute(c); ...

  5. Qt中利用QProcess调用外部cmd.exe执行程序

    1.#include "mainwindow.h"中 添加头文件: #include <QProcess> 添加成员: QProcess *myprocess; 添加槽 ...

  6. Qt文档阅读笔记-Qt工作笔记QProcess::finished的解析与实例

    目录 官方解析 博主例子 阻塞主程序运行外部程序 使用本地事件循环不阻塞主程序运行外部程序 官方解析 void QProcess::finished(int exitCode, QProcess::E ...

  7. QT软件开发: QProcess启动进程完成交互并获取输出

    一.QProcess介绍 QProcess类用于启动外部程序并与它们通信. QProcess允许将进程视为I/O设备.可以像使用qtcsocket访问网络连接一样对进程进行写入和读取.然后可以通过调用 ...

  8. QT学习之QProcess进程调用

    项目中遇到需要调用外部程序并且需要与之通信的问题,做下记录. 背景是想获取matlab的版本号,思路是想通过cmd系统调用 "matlab.exe -h"命令获取返回版本信息. Q ...

  9. Qt之:QProcess使用总结

    1.主程序:初始化及设定信号槽 process = new QProcess();connect(process,SIGNAL(started()),SLOT(started()));connect( ...

最新文章

  1. ASP.NET网页中RAR、DOC、PDF等文件下载功能实例源代码
  2. golang中的栈帧
  3. JavaScript实现radianToDegree弧度到度算法(附完整源码)
  4. ZendStudio-v6.0注册机
  5. winform 菜单激发窗体切换做法
  6. php日志文件过大,Windows服务器系统下Apache的error.log文件过大的解决办法
  7. 嵌入式实时操作系统ucos-ii_「正点原子NANO STM32开发板资料连载」第三十六章 UCOSII 实验 1任务调度...
  8. 2016计算机一级成绩,2016年江苏计算机一级成绩查询_无忧考网.docx
  9. transformermo
  10. python训练营 朋友圈点赞收费吗_微信朋友圈点赞,是不是扣话费?有人给
  11. USB 转 RS-485 / 422 接口转换器
  12. SpringBoot+Vue实现前后端分离的旅游推荐网站
  13. EasyUI filebox 限制文件上传的类型
  14. iMX6UL lvgl开发备忘
  15. 什么原因可能会造成Android手机卡顿?
  16. win10更新后D盘变成CD驱动器
  17. android震动代码分析
  18. 测试 zxdfasd阿斯顿水电费健康sdgfsdgsg的发oip挥加快了地方噶是的
  19. 19 M2芯片的MAC安装安卓模拟器
  20. python统计套利_统计套利(二),利用协整关系进行配对交易【原文】

热门文章

  1. Ubuntu解决ifconfig command not found的办法
  2. Mac adb 安装
  3. 80211n标准建链速率计算
  4. jave 逻辑运算 vs 位运算 + Python 逻辑运算 vs 位运算
  5. 写了个关于tomcat项目部署脚本 shell
  6. Code First 下自动更新数据库结构(Automatic Migrations)
  7. 【长沙集训】2017.10.28
  8. 安装cifs 访问windows的共享文件
  9. 模式串匹配的BF算法和KMP算法
  10. const的修饰规则