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

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

  2. mysql教程qt linux_一步步学Qt,第四天-Linux 下mysql数据库链接

    一步步学Qt,第四天-Linux 下mysql数据库链接 现在在linux系统下面,完成之前的qt-mysql连接工作,此次我新安装了新版的qt,也按照qtassistant对mysqldriver进 ...

  3. Qt学习(四)---实例涂鸦画板mspaint

    Qt学习(四)-实例涂鸦画板mspaint 一.Qt图形绘制 自己在Qt开源社区在自学yafeilinux前辈的<Qt快速入门系列教程>中的图形篇,结合所学的知识,可以做一个涂鸦板实例 二 ...

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

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

  5. 【Qt】通过QtCreator源码学习Qt(四):插件管理PluginManager

    1.简介 QtCreator使用插件架构,方便扩展.它的核心是插件管理,主类是PluginManager. 下面是翻译src\libs\extensionsystem\pluginmanager.cp ...

  6. Qt学习(四):qt读写文件

    知识点 QFile读写文件 QFileInfo获取文件信息 QDataStream读写文件 QTextStream读写文件 内存文件QBuffer读写文件 结果演示 widget.h #ifndef ...

  7. Qt笔记(四十)之Qt打开笔记本摄像头

    一.前言 楼主最近开始接触摄像头这一块,发现Qt有封装好的库,于是就想记录相关的学习历程,方便自己查看,该文章只是简单实现了打开摄像头, 截图 关闭摄像头的功能 二.实现过程 1新建工程的时候需要mo ...

  8. Qt笔记(四十一)之qtcreator添加pri文件

    一.前言 随着项目越来越多,需要对项目的进行管理以及模块化,有利于后续的维护,Qt刚好提供了一个机制,就是创建pri文件,楼主以此做个记录 二.添加流程 1.新建一个Qt工程 2.去到工程目录下,新建 ...

  9. ​Hello Qt(四十七)——QtQuick基础​

    一.QtQuick简介 QT提供了两种独立的方法创建用户界面. QtQuick模块为创建流畅.鲜活的用户界面提供了一种标记语言.QtQuick模块适合需要动画元素的界面,以及应用程序主要运行在小屏幕和 ...

最新文章

  1. vue中使用mockjs
  2. wsl ubuntu 版本_让Ubuntu滚动更新
  3. Velocity——模板中转换字符串首字母小写解决方案
  4. hive 操作(五)——常用内置函数
  5. php打印文本中随机行内容
  6. Android 框架揭秘 --读书笔记
  7. 自学单片机入门学习建议
  8. 华为网吧服务器型号,网吧需要什么配置的服务器
  9. 档案查询系统php,档案信息管理系统 v2.0
  10. 这是一个没有现金的国家——丹麦
  11. python常见的缩进错误_python常见编译错误:IndentationError缩进错误
  12. Adobe illustrator/Ai 2019 软件安装包
  13. Linux——文件句柄数设置
  14. Elasticsearch一网打通
  15. roslaunch卡死
  16. 游戏王计算机兽,游戏王电脑堺卡牌——图腾鸟,神船号,充能战士,水晶翼,炎斩机...
  17. 再见!IBM中国研究院
  18. 面试算法题:1 到 1000 之间有多少个 7?
  19. 6.查询学过编号“001”并且也学过编号“002”课程的同学的学号、姓名
  20. 亚马逊Listing变“狗”怎么办?这7大解决方案仅供参考!

热门文章

  1. ItelliJ IDEA开发工具使用—创建一个web项目
  2. Linux whoami命令、Linux su命令、Linux w命令
  3. 【Java】 大话数据结构(1) 线性表之顺序存储结构
  4. [LeetCode]LRU Cache有个问题,求大神解答【已解决】
  5. 迭代之嵌套的for循环
  6. C++没有调用析构函数
  7. mongodb分片概念和原理-实战分片集群
  8. ROS系统玩转自主移动机器人(3)-- 开源机器人结构介绍
  9. 前端入门教程(七)CSS属性设置
  10. 【 CDN 最佳实践】CDN 命中率优化思路