Qt技巧:QProcess与外部程序的调用

项目做到一定阶段,经常需要在原来的工程上调用外部程序。Qt为此提供了QProcess类,QProcess可用于完成启动外部程序,并与之交互通信。

一、启动外部程序的两种方式:

(1)一体式:void QProcess::start(const
QString & program, const QStringList & arguments, OpenMode mode = ReadWrite)

外部程序启动后,将随主程序的退出而退出。

(2)分离式:void QProcess::startDetached(const
QString & program, const QStringList & arguments, const QString & workingDirectory = QString(), qint64 * pid = 0)

外部程序启动后,当主程序退出时并不退出,而是继续运行。

值得注意的是,当程序路径中含有空格的时候,仅设置程序路径program是无法被识别的,解决方法是再将程序路径传递给arguments。

例如:

  1. //1-不带空格,可以启动
  2. process->start("F:/AppInst/115/115com/115com.exe");
  3. //2-带空格,无法启动
  4. process->start("C:/Program
    Files/HaoZip/HaoZip.exe");
  5. //3-带空格,使用带参模式,可以启动
  6. process->start("C:/Program
    Files/HaoZip/HaoZip.exe", QStringList("C:/Program
    Files/HaoZip/HaoZip.exe"));

二、启动之前需要做的工作:

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.

启动一个外部程序,需要传递外部程序的路径和执行参数,参数用QStringList来带入。

(1)设置路径:     
    void QProcess::setProgram(const
QString & program)

(2)设置参数[可选]: void QProcess:: setArguments(const
QStringList & arguments)

(3)启动:                void
QProcess::start(OpenMode mode = ReadWrite)

Qt官方自带的例子:

  1. QObject *parent;
  2. ...
  3. QString program = "./path/to/Qt/examples/widgets/analogclock";
  4. QStringList arguments;
  5. arguments << "-style" << "fusion";
  6. QProcess *myProcess = new QProcess(parent);
  7. myProcess->start(program, arguments);

其实,start()或startDetached()已经整合了上面的三个步骤,如果需要分别设置,请采用以上的方式。

三、启动状态

外部程序未启动时,其状态是NotRunning;

当启动时,其状态转变为Starting,正在启动,但此时还未调用起来;

启动之后,继续变为Running,同时发射出started()信号,此时,可以对QProcess进行读写操作了;

当退出时,其状态改为NotRunning,并发射出finished()信号。finishe()信号会携带退出码和退出状态,可以分别通过exitCode()和exitStatus()来获得。

当发生错误时,QProcess会发出一个error()信号,同样的,也可以通过error()来获得其错误类型,通过state()获得当前程序的状态。

四、QProcess
与 QIODevice

QProcess继承于QIODevice,因此,我们可以把它当作是一个I/O设备进行读写操作。

五、交互

QProcess有两种预定义的输出通道:标准输出stdout与标准错误stderr。

通过setReadChannel()可以选择当前读取输出的通道。

当通道中的数据准备就绪时,QProcess会发出readyRead()信号。如果是标准输出,则发出readyReadStandardOutput()信号;如果是标准错误,则发出readyReadStandardError()信号。

常用的读取方式有read(), readAll()或getChar(),也可以通过readAllStandardOutput()和readAllStandardError()读取标准输出和标准错误通道中的数据。

某些程序需要环境设置才能进行特殊的操作。可以通过setEnvironment()来设置环境变量,通过setWorkingDirectory()来设置工作目录,默认的工作路径是当前调用程序的工作路径。

六、Synchronous
Process API (同步进程API)

QProcess提供了一系列的函数以提到事件循环来完成同步操作:

(1)waitForStarted() 
        : 阻塞,直到外部程序启动

(2)waitForReadyRead() 
  : 阻塞,直到输出通道中的新数据可读

(3)waitForBytesWritten() 
: 阻塞,直到输入通道中的数据被写入

(4)waitForFinished()     
  : 阻塞,直到外部程序结束

如果在主线程(QApplication::exec())中调用这些函数,可能会造成当前用户界面不响应。

七、主要API

请参考Qt的官方说明:QProcess
Class

PS:参考链接

从QProcess说开来(一)

从QProcess说开来(二)

时间: 2024-10-29 05:02:06

Qt技巧:QProcess与外部程序的调用的相关文章

QProcess与外部程序的调用(可以通过设置管道来交互)

项目做到一定阶段,经常需要在原来的工程上调用外部程序.Qt为此提供了QProcess类,QProcess可用于完成启动外部程序,并与之交互通信. 一.启动外部程序的两种方式:(1)一体式:void QProcess::start(const QString & program, const QStringList & arguments, OpenMode mode = ReadWrite)外部程序启动后,将随主程序的退出而退出.(2)分离式:void QProcess::startDet

Inter-process communication in Qt using QProcess

Recently, I needed to call a CUI program from within Qt GUI window and simulate the effect of an embedded command line window like the Autolisp console in AutoCAD. At the beginning, I wanted to implement this function using UNIX pipe. However, I foun

QT中QProcess调用命令行的痛苦经历

阅读目录 创建压缩包的方法 在QT中调用命令行 在QT中调用C++创建的dll 在QT程序中需要将某些目录和文件压缩为一个rar的压缩包,于是想到了在QT中通过QProcess类调用命令行的rar.exe来达到效果,但是没想到QProcess类用起来很麻烦,而且达不到效果,折腾了2天仍然没找到原因,使用另外一种办法解决了. 回到顶部 创建压缩包的方法 在windows平台创建压缩包,可以直接使用rar.exe,该程序在安装winrar之后,在其安装目录下就可以找到.该程序是winrar对应的命令

QT中QProcess调用详解及实验

在QT程序中需要将某目录和文件压缩为一个rar的压缩包,于是想到了在QT中通过QProcess类调用命令行的rar.exe来达到效果,但是没想到QProcess类用起来很麻烦,而且达不到效果,折腾了2天仍然没找到原因,使用另外一种办法解决了. 创建压缩包的方法 在windows平台创建压缩包,可以直接使用rar.exe,该程序在安装winrar之后,在其安装目录下就可以找到.该程序是winrar对应的命令行版本,其语法例子如下: rar.exe a -k -r -s -m1 test.rar d

QT编写DLL给外部程序调用,提供VC/C#/C调用示例(含事件)

最近这阵子,接了个私活,封装一个开发包俗称的SDK给客户调用,查阅了很多人家的SDK,绝大部分用VC编写,而且VC6.0居多,估计也是为了兼容大量的XP用户及IE浏览器,XP自带了VC6.0运行库,所以无需兼带其他DLL即可运行.也发现有些用汇编和C封装的,那估计是高手才能编写啊!那怎么办呢?眼看一星期的交货期要到了,由于本人从来没有写过SDK开发包,心里那个着急啊,赶紧想出了三种处理方案. 方案一: 用自己最熟悉的QT来写,毕竟QT也是C++的一种嘛,应该可以和VC通用的.初步实验,你妹啊,调

使用Qprocess的startDetached()方法调用外部exe程序

使用Qprocess的startDetached()方法,当前程序关闭时,调用的外部程序能够照常运行. QProcess::startDetached("C:\\Qt\\1.exe",QStringList()); 记得在头文件中添加#include <QProcess>,不然编译不通过

QT共享库的创建与调用(初级)

背景: 最近在做的一个项目其中一部分既是实现PC与下位机的USB通信.windows平台下已经完成,现需移植到linux平台下. 在linux系统中,通过一段时间的工作,设备已被配置成hid类(后续再详述),并以hidraw类设备节点存在于系统中"/dev/"下.上位机则成功在console中通过调用HIDAPI库来写入.读取hidraw设备节点信息(后续再详述),而进一步的图形界面则需由QT来完成. hidraw设备介绍: https://www.kernel.org/doc/Doc

QT点击&quot;X&quot;按钮,调用closeEvent()函数来实现调用特定事件

背景: QT在用户关闭窗口(直接点击"X"键)时,程序一般都需要做一些善后的事情,就我现在的程序来说,既关闭USB.如何实现? 正文: 首先,在对应窗体的".h"文件包含 #include <QCloseEvent>;的头文件. 其次,在该".h"文件中声明函数 void closeEvent( QCloseEvent * event); 注意:该函数已经在QT内部建立为点击"X"按钮的槽,不能更改其函数名: 最后

QT下实现对Linux Shell调用的几种方法

使用QProcess QThread ============================================ #include <QProcess>int main(){QProcess::execute("ls");return 0;} ============================================   QProcess *poc = new QProcess; poc-> start( "ping 222.20