概述
Qt 5.12--QProcess
- 1 简介
- 1.1 介绍
- 1.2 官方示例
- 1.3 同步流程API
- 2 详解
- 2.1 启动方式
- 2.2 路径空格问题
- 2.3 启动流程
- 2.4 启动状态
- 2.5 交互
- 3 用例
- 3.1 使用管道
- 3.2 处理指令
- 3.3 功能类
- 参考
1 简介
1.1 介绍
QDesktopServices 提供的方法 访问 常用的桌面 服务 , 如 浏览 器 、 播放器、 电子邮件客户端。
QProcess中类用于启动其他外部程序,并与他们进行通信。
QProcess继承于QIODevice,因此,我们可以把它当作是一个I/O设备进行读写操作。
1.2 官方示例
QObject *parent;
...
QString program = "./path/to/Qt/examples/widgets/analogclock";
QStringList arguments;
arguments << "-style" << "fusion";
QProcess *myProcess = new QProcess(parent);
myProcess->start(program, arguments);
- QProcess 之后进入启动状态,然后发出started()信号。
- QProcess允许您将进程视为顺序I / O设备。 您可以像使用QTcpSocket访问网络连接一样来写入和读取该过程。 然后,您可以通过调用write()写入进程的标准输入,并通过调用read(),readLine()和getChar()读取标准输出。 因为QProcess继承了QIODevice,所以它还可以用作QXmlReader的输入源,或生成要使用QNetworkAccessManager上载的数据。
- 当进程退出时,QProcess重新进入NotRunning状态(初始状态),并发出finish()。
finish()信号将进程的退出代码和退出状态作为参数提供,您还可以调用exitCode()获得最后完成的进程的退出代码,并调用exitStatus()获得其退出状态。 如果在任何时间点发生错误,QProcess将发出errorOccurred()信号。 您还可以调用error()来查找最后发生的错误类型,并调用state()来查找当前进程状态。 - 注意:VxWorks,iOS,tvOS,watchOS或通用Windows平台不支持QProcess。
1.3 同步流程API
QProcess提供了一组函数,通过挂起调用线程直到发出某些信号,它可以在没有事件循环的情况下使用:
waitForStarted()阻塞,直到进程开始。
waitForReadyRead()阻塞,直到有新数据可在当前读取通道上读取为止。
waitForBytesWritten()阻塞,直到将一个有效载荷数据写入该进程为止。
waitForFinished()阻塞,直到过程完成。
从主线程(调用QApplication :: exec()的线程)调用这些函数可能会导致用户界面冻结。
以下示例运行gzip压缩字符串“ Qt rock!”,而没有事件循环
QProcess gzip;
gzip.start("gzip", QStringList() << "-c");
if (!gzip.waitForStarted())
return false;
gzip.write("Qt rocks!");
gzip.closeWriteChannel();
if (!gzip.waitForFinished())
return false;
QByteArray result = gzip.readAll();
2 详解
2.1 启动方式
QProcess启用外部程序,分为一体式和分离式。
- 一体式
void QProcess::start(const QString & program, const QStringList & arguments, OpenMode mode = ReadWrite)
外部程序启动后,将随主程序的退出而退出。
- 分离式
void QProcess::startDetached(const QString & program, const QStringList & arguments, const QString & workingDirectory = QString(), qint64 * pid = 0)
外部程序启动后,当主程序退出时并不退出,而是继续运行。
2.2 路径空格问题
//1-不带空格,可以启动
process->start("~/workspace/subApp");
//2-带空格,无法启动
process->start("~/backup workspace/subApp");
//3-带空格,使用带参模式,可以启动
process->start("~/backup workspace/subApp", QStringList("~/backup workspace/subApp"));
2.3 启动流程
启动一个外部程序,需要传递外部程序的路径和执行参数,参数用QStringList来带入。
(1)设置路径: void QProcess::setProgram(const QString & program)
(2)设置参数[可选]: void QProcess:: setArguments(const QStringList & arguments)
(3)启动: void QProcess::start(OpenMode mode = ReadWrite)
QObject *parent;
...
QString program = "./path/to/Qt/examples/widgets/analogclock";
QStringList arguments;
arguments << "-style" << "fusion";
QProcess *myProcess = new QProcess(parent);
myProcess->start(program, arguments);
start()或startDetached()已经整合了上面的三个步骤,如果需要分别设置,请采用以上的方式。
2.4 启动状态
外部程序未启动时,其状态是NotRunning;
当启动时,其状态转变为Starting,正在启动,但此时还未调用起来;
启动之后,继续变为Running,同时发射出started()信号,此时,可以对QProcess进行读写操作了;
当退出时,其状态改为NotRunning,并发射出finished()信号。finishe()信号会携带退出码和退出状态,可以分别通过exitCode()和exitStatus()来获得。
当发生错误时,QProcess会发出一个error()信号,同样的,也可以通过error()来获得其错误类型,通过state()获得当前程序的状态。
2.5 交互
QProcess有两种预定义的输出通道:标准输出stdout与标准错误stderr。
通过setReadChannel()可以选择当前读取输出的通道。
当通道中的数据准备就绪时,QProcess会发出readyRead()信号。如果是标准输出,则发出readyReadStandardOutput()信号;如果是标准错误,则发出readyReadStandardError()信号。
常用的读取方式有read(), readAll()或getChar(),也可以通过readAllStandardOutput()和readAllStandardError()读取标准输出和标准错误通道中的数据。
某些程序需要环境设置才能进行特殊的操作。可以通过setEnvironment()来设置环境变量,通过setWorkingDirectory()来设置工作目录,默认的工作路径是当前调用程序的工作路径。
3 用例
3.1 使用管道
QStringList options;
options << "-c" << "ls -l | grep a | sort";
QProcess process;
process.start("/bin/bash", options);
process.waitForFinished();
process.waitForReadyRead();
//
process.close();
3.2 处理指令
QProcess::execute("ls");
3.3 功能类
AddApp::AddApp()
{
process = new QProcess();
QObject::connect(process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(processError (QProcess::ProcessError)));
}
void AddApp::startProcess()
{
process->start("~/a.out");
}
void AddApp::processError(QProcess::ProcessError error)
{
switch(error)
{
case QProcess::FailedToStart:
// TODO
break;
case QProcess::Crashed:
// TODO
break;
case QProcess::Timedout:
// TODO
break;
case QProcess::WriteError:
// TODO
break;
case QProcess::ReadError:
// TODO
break;
case QProcess::UnknownError:
// TODO
break;
default:
// TODO
break;
}
}
void AddApp::processQuit()
{
if (process)
{
process->close();
delete process;
process = NULL;
}
}
参考
1、QProcess类
2、Qt 中用QProcess调用cmd命令
3、QT进程间通信详细介绍及QProcess机制分析
4、QT执行shell脚本或者执行linux指令
5、qt中如何启动其他应用程序(如果不成功,还有许多原因即QProcess::ProcessError可供分析)
6、QProcess与外部程序的调用(可以通过设置管道来交互)
7、Qt之:QProcess使用总结
最后
以上就是伶俐蓝天为你收集整理的Qt 5.12--QProcess1 简介2 详解3 用例参考的全部内容,希望文章能够帮你解决Qt 5.12--QProcess1 简介2 详解3 用例参考所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复