QT输入输出(四)之 QProcess
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相关推荐
- Qt输入输出之QProcess
Qt输入输出之QProcess Qt提供了一个QProcess类用于启动外部程序并与之通信.这个类是异步工作的,而且在后台执行,这样用户界面就可以始终保持响应.启动一个新的进程的操作非常简单,只需要将 ...
- mysql教程qt linux_一步步学Qt,第四天-Linux 下mysql数据库链接
一步步学Qt,第四天-Linux 下mysql数据库链接 现在在linux系统下面,完成之前的qt-mysql连接工作,此次我新安装了新版的qt,也按照qtassistant对mysqldriver进 ...
- Qt学习(四)---实例涂鸦画板mspaint
Qt学习(四)-实例涂鸦画板mspaint 一.Qt图形绘制 自己在Qt开源社区在自学yafeilinux前辈的<Qt快速入门系列教程>中的图形篇,结合所学的知识,可以做一个涂鸦板实例 二 ...
- Qt QT的I/O流 QT输入输出
1. QFile QDataStream 读写文件 二进制读写文件 #include <QApplication> #include <QtGui> #include < ...
- 【Qt】通过QtCreator源码学习Qt(四):插件管理PluginManager
1.简介 QtCreator使用插件架构,方便扩展.它的核心是插件管理,主类是PluginManager. 下面是翻译src\libs\extensionsystem\pluginmanager.cp ...
- Qt学习(四):qt读写文件
知识点 QFile读写文件 QFileInfo获取文件信息 QDataStream读写文件 QTextStream读写文件 内存文件QBuffer读写文件 结果演示 widget.h #ifndef ...
- Qt笔记(四十)之Qt打开笔记本摄像头
一.前言 楼主最近开始接触摄像头这一块,发现Qt有封装好的库,于是就想记录相关的学习历程,方便自己查看,该文章只是简单实现了打开摄像头, 截图 关闭摄像头的功能 二.实现过程 1新建工程的时候需要mo ...
- Qt笔记(四十一)之qtcreator添加pri文件
一.前言 随着项目越来越多,需要对项目的进行管理以及模块化,有利于后续的维护,Qt刚好提供了一个机制,就是创建pri文件,楼主以此做个记录 二.添加流程 1.新建一个Qt工程 2.去到工程目录下,新建 ...
- Hello Qt(四十七)——QtQuick基础
一.QtQuick简介 QT提供了两种独立的方法创建用户界面. QtQuick模块为创建流畅.鲜活的用户界面提供了一种标记语言.QtQuick模块适合需要动画元素的界面,以及应用程序主要运行在小屏幕和 ...
最新文章
- vue中使用mockjs
- wsl ubuntu 版本_让Ubuntu滚动更新
- Velocity——模板中转换字符串首字母小写解决方案
- hive 操作(五)——常用内置函数
- php打印文本中随机行内容
- Android 框架揭秘 --读书笔记
- 自学单片机入门学习建议
- 华为网吧服务器型号,网吧需要什么配置的服务器
- 档案查询系统php,档案信息管理系统 v2.0
- 这是一个没有现金的国家——丹麦
- python常见的缩进错误_python常见编译错误:IndentationError缩进错误
- Adobe illustrator/Ai 2019 软件安装包
- Linux——文件句柄数设置
- Elasticsearch一网打通
- roslaunch卡死
- 游戏王计算机兽,游戏王电脑堺卡牌——图腾鸟,神船号,充能战士,水晶翼,炎斩机...
- 再见!IBM中国研究院
- 面试算法题:1 到 1000 之间有多少个 7?
- 6.查询学过编号“001”并且也学过编号“002”课程的同学的学号、姓名
- 亚马逊Listing变“狗”怎么办?这7大解决方案仅供参考!