QT中调用外部程序的方法 QProcess类

QtUI界面被QProcess阻塞(已解决) QProcess提供了三个函数 1、QProcess::execute() 以堵塞方式的执行shell命令,当命令执行完成后,调用进程才会继续执行。命令输出的任何数据都将转发给调用进程输出(因此无法捕获)。 2、QProcess::start() 以异步方式的执行shell命令,命令输出的数据存储于缓冲区,可以通过readAllStandardOutput()捕获 3、QProcess::startDetached() 以分离的方式执行shell命令,调用进程退出,则分离的进程将继续运行,而不受影响。 阅读详情

QT4对于界面编程无疑是一个很方便的工具。但是由于它界面开发专项特性,可能导致了某些方面的不足(到目前为止暂时没有使用到这类复杂功能,所以只能是推测)。这样当整个程序需要某些功能时,就需要外部模块的支持。为了能够与外部程序相互联系,Qt4提供了强大的外部程序调用类。先说说QProcess类,目前主要用到程序调用函数。官方说明如下:

(引用自ttp://qt.nokia.com/doc/4.5/qprocess.html#execute-2)

  

#include <QProcess>

int QProcess::execute ( const QString & program, const QStringList & arguments )   [static]
Starts the program program with the arguments arguments in a new process, waits for it to finish, and then returns the exit code of the process. Any data the new process writes to the console is forwarded to the calling process.

The environment and working directory are inherited by the calling process.

On Windows, arguments that contain spaces are wrapped in quotes.

int QProcess::execute ( const QString & program )   [static]
This is an overloaded function.

Starts the program program in a new process. program is a single string of text containing both the program name and its arguments. The arguments are separated by one or more spaces.

  

   这两个函数使用起来是很简单的,很方便就可以调用外部程序。

   但是有一点是值得注意的,当外部函数被调用以后,主程序的进程就会被调用的函数阻塞,导致无法继续对操作做出反映。要解决这个问题,可以利用QThread类为调用的外部程序建立一个新进程,建立方法如下:

例如需要在窗口中打开注册表编辑器

    1、明确打开文件的位置和名称,注册表编辑器名称为regedit

    2、建立一个类MyThread,用于继承QThread类,并声明虚函数run(),该函数用于程序调用该进程时自动调用。

      

       #include <QThread>

       class MyThread : public QThread

       {

        public

            void run();

       };

    3、在MyTread::run()函数中添加需要该进程执行的内容(本例子中要利用QProcess类调用regedit)

       #include <QProcess>

       void MyThread::run()

       {

            QProcess process;

           

            process.execute("regedit");

        }

     经过以上的处理后,在运行regedit的时候主窗口就不会因阻塞而无响应了。

     这只是个简单的实现外部函数调用的方法,至于进程如何同步的问题,还在继续研究中


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/robin7513/archive/2009/11/22/4850826.aspx

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

问题:
    我做的那个小软件的图形界面是基于QT3.2的,在主界面的命令行编辑框输入命令以后要执行别人已经写好的可执行文件。这些可执行文件执行的时间比较长,在终端上运行时会显示一些运行的信息,最后才显示执行结果。我的界面上有一个文本框,我想把它们在后台执行过程中的信息不断添加到文本框中,相当于实时显示吧,不过要求也不是那么高。

    我说我现在怎么做的吧,我在一个叫做QGUI_CommandWidget类(属于主窗口)中定义了一个命令行编辑框输入命令,定义一个QTextEdit对象用来显示那些执行信息,定义了一个自定义的MyThread类对象用来执行外部程序,在这个线程的run函数里我调用fork,execv函数执行外部程序,把可执行程序的标准输出重定向到管道,然后从管道读那些信息,再把这些信息用QApplication::postEvent()函数传回主线程,由主线程把这些信息append到文本框中。

    我现在的疑问是:
        第一,执行外部程序,用fork、execv函数是不是不行,非要用QProcess不可?为什么呢?论坛上讲的也不是很清楚。具体怎么做呢?在那个QGUI_CommandWidget类创建一个QProcess类对象还是在我MyThread类对象里再创建一个QProcess类对象?
        第二,基于qt3的GUI线程和非GUI线程的通信,应该怎么做?那个外部程序我是不能更改的,它什么时候结束我也不知道。用QProcess的话它的输出信息我要怎么样才能读到然后回显在我的主窗口的文本框中?怎么知道可执行程序结束然后杀死该线程?
        第三,我在《C++ GUI programming with qt3》中看到:“ QTimer 类以及应用于网络的QFtp, QHttp, QSocket, and QSocketNotifier 类都是基于消息事件循环的,所以也不能用在非GUI线程中。”这是为什么呢?还有我看了别人用QQSocketdevice的例子里都用到了QSocketNotifier。在你的博客说到用Qthread、QQSocketdevice、QWaitCondition可以完成视频采集,你是否也用到QSocketNotifier?

回答:
1)完全可以使用fork,execv函数,其实QProcess类只是对这些底层函数的封装而
已,但是考虑到使用QProcess的话,不需要自己处理程序管道,也不需要自己处理
windows下的情况,可以省去很多时间,因此还是推荐使用QProcess,他们的效果
将是一样的。

2)照你的需求,完全可以不需要使用线程,因为QProcess已经自己处理掉这些事
了,在使用QProcess的start函数执行外部程序后,这个函数不会被阻塞,另外
QProcess也会以事件的方式自动将外部程序传回的信息反馈回来。具体看以下这个
简单的例子:

class enstCdRecord : public QObject
...{
  。。。。。。。。。。。。
  QProcess mProcess;
};

enstCdRecord::enstCdRecord(QWidget *pParent)
...{
  mParent = pParent;
  connect(&mProcess, SIGNAL(readyReadStandardError()), this,
  SLOT(ReadProcessOutput())); //连接readyReadStandardError事件,这样就可以
    得到程序StdErr中的信息了,同样也可以连接其 readyReadOutput事件。
}

bool enstCdRecord::CreateCd(const QString &pImageFile)
...{
  QStringList cmdlist;
  cmdlist.append("-v");
  cmdlist.append("speed=2");
  cmdlist.append(pImageFile);

  mProcess.start("cdrecord.exe", cmdlist);
  while (! mProcess.waitForFinished(300)) ...{ //启动程序后,用循环等待其结
    束,如果对程序何时结束并不关心,以下代码可以不需要。
  if (mProcess.state() == QProcess::NotRunning) ...{ //process failed
    QMessageBox::critical(mParent, SYSTEMNAME, tr("Error when record cd."));
    return false;
  }
  qApp->processEvents(); //防止UI死锁,一般情况下,用这种等一小段时间(这
    里是300ms),让UI响应一次的办法,已经足够使用了。
  }
  if (mProcess.exitCode() != 0) ...{ //error when run process
    QMessageBox::critical(mParent, SYSTEMNAME, tr("Error when record cd."));
    return false;
  }
  return true;
}

void enstCdRecord::ReadProcessOutput()
...{
  QMessageBox::critical(mParent, SYSTEMNAME,
  mProcess.readAllStandardError()); //将程序的StdErr信息显示出来。
}

外部程序究竟使用StdOut还是使用StdErr来作为运行时状态的输出,各个程序的处
理方式都不一样,甚至可能根本没有输出,这个需要自己试验。

3)一般网络程序中只要在主线程中使用QSocket和QSocketNotifier,就可以完成
数据的发送和接收了,它们不会造成程序界面死锁。在我写的blog的情况下,我的
程序在从网络上接收到数据后,需要做一些计算处理和保存工作,由于数据量很
大,并且程序对性能的要求比较高,因此只能将整个网络数据接收功能放到线程中
了,在那种情况下,QSocket并不适用,而必须使用同步的QSocketDevice。

其实,QT3下提供两种网络访问功能,一类是QFtp, QHttp, QSocket, and
QSocketNotifier等,它们都会在接收到数据后,以事件方式进行通知。另一类是
QSocketDevice,它不会主动发出任何通知事件,而是必须靠外部程序来查询,或
者等待其接收到数据,才能知道何时有数据被收到。

《C++ GUI programming with qt3》中的那句话没有错,(但是它是针对QT3说的,
在QT4中根本就没有这几个类了,并且QT4中Thread也可以用事件了)。在QT3中,
只有 UI线程在可以使用事件,在其它辅助线程中是无法使用的,因此不能使用靠
事件进行通知的那几个类了。

我的程序中没有使用QSocketNotifier,正如前面说的,这个类只是配合QSocket使
用的,它是考事件进行通知的。我的程序使用的是 QSocketDevice,并且靠其Wait
功能,来等待数据到达。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/tonylk/archive/2006/10/01/1315525.aspx


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhoubl668/archive/2010/01/14/5188655.aspx

QtQProcess调用外部exe 请注意,有些程序可能不会在后台运行。在这种情况下,建议使用。将以独立进程启动外部程序,而不会等待它完成,因此您无法使用。,可用于启动和与外部进程交互。方法来检查进程退出代码。 阅读详情

相关推荐

QT QProcess 调用外部exe程序

大致内容: QProcess 调用外部的方式 window系统下调用外部程序的注意事项 当路径中出现空格的处理方式 QProcess 调用外部程序的三种方式: QProcess::execute() 会阻塞主窗口线程 QProcess::start() 不会阻塞主窗口线程,可以在外部程序运行过程中获取相关信息 QProcess::startDetached() 不会阻塞主窗口线程,只能在外部程序运行结束后获取相关信息 不想阻塞主窗口,且获取相关信息的,start首选 在window系统下使用QPr

YDDUONG的博客 4542

使用QProcess::execute调用可执行程序

Qt调用可执行程序或bin命令

qianqiaoqianqi的博客 3409

NSIDC海冰运动产品-速度矢量场图绘制(数据下载和处理--年、季节平均)【python/basemap】

入门级NSIDC海冰运动产品速度矢量场图绘制(数据下载和处理--年、季节平均)【python/basemap】

Mluoo的博客 2930

qt QProcess

qt QProcessQProcess常用三个函数:QProcess::execute():以阻塞方式打开外部程序,只有当外部程序执行完后才继续往后执行现程序。其中,外部程序的标准输出、标准错误都是重定向到现程序的标准输出和标准错误。QProcess::start():               以子进程的方式打开外部程序,外部进程和现进程执行互不干扰,但外部进程的父进程是现进程。QProces...

吾生也有涯,而知也无涯 8714

Qt中执行外部程序介绍 QProcess

Qt中如何调用外部程序呢? 最近遇到这个问题,解决方法如下: 用QProcess解决这个问题: 如执行a.exe, 带两个参数为 -z20,-q85 第一种方法:使用QProcess静态函数QProcess::startDetached(const QString &program, constQStringList &argument)或者QProcess::execute(

晴天的专栏 2211

QProcess 使用总结

QProcess 使用总结

编程猿来如此 4927

QProcess应用

利用QProcess调用外部程序,并传递参数 //typedef QProcess::CreateProcessArgumentModifier //Note: This typedef is only available on desktop Windows. include <Windows.h> QString program = "C:/Windows/System32/not...

lubufan的博客 926

qprocess qt 打开word_在Qt中,如何用QProcess快速实现外部程序调用

总第14篇本文主要详细总结了在Qt项目开发过程中,如何借助QProcess快速实现外部程序调用,并在此基础上说明了相关接口的用法。通过阅读本文你将掌握程序进程间调用方法,以便在以后的开发过程中可以参考。1.QProcess及接口介绍QProcessQt中专门用于启动一个外部程序进程并与主程序通信的。此中包含多个静态函数和信号,可以方便地通过信号与槽机制实现信息互通。我们要实现快速调用外...

weixin_39767513的博客 360

QT4-外部程序调用的简单方法

   QT4对于界面编程无疑是一个很方便的工具。但是由于它界面开发专项特性,可能导致了某些方面的不足(到目前为止暂时没有使用到这复杂功能,所以只能是推测)。这样当整个程序需要某些功能时,就需要外部模块的支持。为了能够与外部程序相互联系,Qt4提供了强大的外部程序调用。先说说QProcess,目前主要用到程序调用函数。官方说明如下:(引用自ttp://qt.nokia.com/doc/4.

robin's evolution 4707

如何在Windows上用Qt调用cmd命令行并获得命令结果(+源代码)

文章目录01 - 适用场合02 - 环境要求03 - 操作步骤3.1 - 界面3.2 - 界面的各种响应3.3 - QProcess的各种响应3.4 - 运行结果04 - 源代码05 - 总结   网上的教程基本没有交互的过程,官网也没有Demo,只有一堆API说明,小白调试一段时间后才运行成功,界面参考了这篇文章,突破点参考了这篇文章,最后整理在一起分享,直接要源码运行的跳转这里 01 - 适...

单眼皮根号三的博客 1万+

Qt调用外部程序QProcess

http://blog.csdn.net/taiyang1987912/article/details/32713781

gjtboa的专栏 1002

Qt 调用外部exe的方法

近期做个快捷菜单,需要调用外部.exe应用程序。 调用外部应用程序时分为阻塞和非阻塞,这里采用非阻塞,因为想调用哪个程序就调用哪个程序嘛。 方法如下: 使用Qprocess的startDetached()方法,当前程序关闭时,调用外部程序能够照常运行。 #include   QProcess::startDetached("E

imxiangzi的专栏 1万+

Qt中,如何用QProcess快速实现外部程序调用

Qt中,如何用QProcess快速实现外部程序调用

aoxuestudy的专栏 3360

QProcess异步启动多个外部程序,并随主程序退出而关闭

startDetached()调用的程序和当前进程脱离关系独立运行。execute()阻塞当前程序,直到外部程序退出。设置要运行的命令及参数arguments。,不会阻塞当前程序,但不会和主程序一起退出。start()不会阻塞当前程序执行。

qq_52218412的博客 1830

Qt学习之QProcess

Qt学习之QProcess

m0_56626019的博客 1843

keil5编程前的工程文件配置,芯片型号支持包配置,用户文件配置,启动文件配置和库函数配置-江科大stm32学习 第一天

1.start文件夹中头文件需要配置路径path,另外user和library也需要,都是同样的操作。如图,在option界面c/c++中,在倒数第二空行的三个点处添加。2.需要设置一个宏,作用是使主函数头文件包含标准库函数,操作如图:复制头文件中8296行的字符串,在option界面的c/c++中第一行define粘贴这个字符串即可。一、首先,下载芯片支持包,选择你自己的器件型号,不懂的可以看我这篇选器件的方法(默认已经注册好用户)点击编译按钮,编译成功后即可在user文件夹里添加main.c正常使用。

weixin_50682964的博客 1917

《基于YOLOv8的工地临边防护栏缺失检测》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!!项目备注1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

上一篇: 常见的几个Qt编程问题的处理
下一篇: qt可停靠控件和工具栏(Dock Widgets and Toolbars)
ryanzz
博客等级 码龄19年 7粉丝 2原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值