【Qt 学习之路】Qt用QProcess调用可执行程序

目录

1、简述

2、启动可执行程序

3、关闭可执行程序

4、官方示例

4.1、运行进程

4.2、同步进程API

5、QProcess简介


1、简述

Qt调用可执行程序的思路:

1、找到可执行程序的路径(注意,路径最好全是英文,无空格)

2、调用此可执行程序

2、启动可执行程序

QProcess pro;

1、带参数(参数具体意义请百度)

pro.startDetached("A.exe", QStringList()<< "/b");

2、不带参数

pro.startDetached("A.exe", QStringList());

3、关闭可执行程序

pro.start("taskkill /f /im A.exe");

QProcess 设置

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

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

4、官方示例

4.1、运行进程

要启动进程,请将要作为参数运行的程序的名称和命令行参数传递给start()。参数在QStringList中作为单独的字符串提供。

或者,您可以将程序设置为使用setProgram()和setArguments()运行,然后调用start()或open()。

例如,下面的代码片段在X11平台上以Fusion样式运行模拟时钟示例,方法是将包含“-style”和“Fusion”的字符串作为参数列表中的两项进行传递:

      QObject *parent;
      ...
      QString program = "./path/to/Qt/examples/widgets/analogclock";
      QStringList arguments;
      arguments << "-style" << "fusion";

      QProcess *myProcess = new QProcess(parent);
      myProcess->start(program, arguments);

4.2、同步进程API

QProcess提供了一组函数,允许在没有事件循环的情况下使用它,方法是挂起调用线程,直到发出某些信号:

  • waitForStarted()块,直到进程启动。
  • waitForReadyRead()块,直到当前读取通道上有新数据可供读取。
  • waitForBytesWritten()块,直到一个有效负载的数据被写入进程。
  • waitForFinished()块,直到进程完成。

从主线程(调用QApplication::exec()的线程)调用这些函数可能会导致用户界面冻结。

以下示例运行gzip来压缩字符串“Qt-rocks!”,而不使用事件循环:


      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();

5、QProcess简介

运⾏过程要启动进程需要将要运⾏的程序的名称和命令⾏参数作为参数传递给start()函数。设置参数的⽅式有两种:

⽅式⼀,将参数保存在QStringList对象中;
⽅式⼆,调⽤setProgram()函数和setArguments()函数进⾏设置。
调⽤start()函数或open()函数启动进程。在程序启动后,QProcess进⼊运⾏状态并发出started()信号。

当进程退出时,QProcess重新进⼊NotRunning状态(初始状态),并发出finish()信号。finish()信号将进程的退出代码和退出状态作为参数提供,开发⼈员还可以调⽤exitCode()函数获得最后完成的进程的退出代码,并调⽤exitStatus()函数获得其退出状态。如果在任何时间点发⽣错误,QProcess将发出errorOccurred()信号。开发⼈员还可以调⽤error()函数来查找最后发⽣的错误类型,并调⽤state()函数来查找当前进程状态。

通道通信
进程具有两个预定义的输出通道:

  • 标准输出通道(stdout)提供常规控制台输出。
  • 标准错误通道(stderr)通常提供由进程打印的错误。

这些通道代表两个单独的数据流,可以通过调⽤setReadChannel()函数在它们之间切换。当前读取通道上有可⽤数据时,QProcess发出readyRead()信号。当有新的标准输出数据可⽤时,它也会发出readyReadStandardOutput()信号,⽽当有新的标准错误数据可⽤时,它会发出readyReadStandardError()信号。⽆需调⽤read()函数,readLine()函数或getChar()函数,⽽是可以通过调⽤readAllStandardOutput()函数或readAllStandardError()函数显式地从两个通道之⼀读取所有数据。
进程的输出通道与QProcess的读取通道相对应,⽽进程的输⼊通道与QProcess的写⼊通道相对应。这是因为我们使⽤QProcess读取的内容是进程的输出,⽽我们编写的内容则成为进程的输⼊。
QProcess可以合并两个输出通道,因此运⾏过程中的标准输出和标准错误数据都使⽤标准输出通道。在启动激活此功能的过程之前,请使⽤MergedChannels调⽤setProcessChannelMode()函数。还可以选择通过传递ForwardedChannels作为参数,,将正在运⾏的进程的输出转发到调⽤主进程。也可以只转发其中⼀个输出通道——通常⼀个将使⽤ForwardedErrorChannel,ForwardedOutputChannel也存在。

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沙振宇

你的鼓励将是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值