http://blog.csdn.net/newbee520/article/details/8279101
 
启动一个新的进程的操作非常简单,只需要将待启动的程序名称和启动参数传递给start()函数即可.
       例如:
  1. QObject *parent;
  2. QString program = "tar"
  3. QStringList arguments;
  4. arguments << "czvf" << "backup.tar.gz" << "/home";
  5. QProcess *myProcess = new QProcess(parent);
  6. QProcess->start(program, arguments);
       当调用start()函数后,myProcess进程立即进入启动状态,但tar程序尚未被调用,不能读写标准输入输出设备.
int exitCode, QProcess::ExitStatus exitStatus)  
错误常量                                值
      描述
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()函数可以把标准输出通道和标准输错误通道合并
  1. #include <QApplication>
  2. #include <QProcess>
  3. #include <QString>
  4. #include <iostream>
  5. int main(int argc, char *argv[])
  6. {
  7. QApplication app(argc, argv);
  8. QProcess proc;
  9. QStringList arguments;
  10. arguments << "-na";
  11. proc.start("netstat", arguments);
  12. // 等待进程启动
  13. if (!proc.waitForStarted())
  14. {
  15. std::cout << "启动失败\n";
  16. return false;
  17. }
  18. // 关闭写通道,因为没有向进程写数据,没用到
  19. proc.closeWriteChannel();
  20. // 用于保存进程的控制台输出
  21. QByteArray procOutput;
  22. // 等待进程结束
  23. while (false == proc.waitForFinished())
  24. {
  25. std::cout << "结束失败\n";
  26. return 1;
  27. }
  28. // 读取进程输出到控制台的数据
  29. procOutput = proc.readAll();
  30. // 输出读到的数据
  31. std::cout << procOutput.data() << std::endl;
  32. // 返回
  33. return EXIT_SUCCESS;
  34. }
  1. <pre name="code" class="cpp"><pre></pre>
  2. <pre></pre>
  3. <pre></pre>
  4. <pre></pre>
  5. <pre></pre>
  6. <pre></pre>
  7. </pre>
为了加深对QProcess类的使用,接下来,在这里再贴上自己编写过的一个案例的代码:这个案例是模拟DOS下的命令窗口的。
"widget.h"头文件
  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QProcess>
  4. #include <QWidget>
  5. namespace Ui {
  6. class Widget;
  7. }
  8. class Widget : public QWidget
  9. {
  10. Q_OBJECT
  11. public:
  12. explicit Widget(QWidget *parent = 0);
  13. ~Widget();
  14. private:
  15. Ui::Widget *ui;
  16. QProcess *pro;//创建一个进程对象
  17. QString out;
  18. private slots:
  19. void on_pushButton_clicked();//运行按钮槽
  20. void readOutput();//从进程中读取数据槽
  21. };
  22. #endif // WIDGET_H

"widget.cpp"源文件

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. Widget::Widget(QWidget *parent) :
  4. QWidget(parent),
  5. ui(new Ui::Widget)
  6. {
  7. ui->setupUi(this);
  8. this->pro = new QProcess;
  9. this->setWindowFlags(Qt::WindowMinimizeButtonHint);
  10. QObject::connect(ui->lineEdit,SIGNAL(returnPressed()),this,SLOT(on_pushButton_clicked()));
  11. //对ui->lineEdit进行信号和槽连接,光标在ui->lineEdit内时按回车键,达到同点击运行按钮一样的效果
  12. QObject::connect(pro,SIGNAL(readyRead()),this,SLOT(readOutput()));
  13. //当准备从进程里读取数据的时候触发输出数据的槽
  14. }
  15. Widget::~Widget()
  16. {
  17. delete ui;
  18. }
  19. void Widget::on_pushButton_clicked()
  20. {
  21. QString cmd = ui->lineEdit->text();
  22. pro->start(cmd);
  23. out = tr("");
  24. ui->textEdit->setText(out);
  25. }
  26. void Widget::readOutput()
  27. {
  28. out += pro->readAll();
  29. ui->textEdit->setText(out);
  30. }

"main.cpp"源文件

  1. #include <QtGui/QApplication>
  2. #include "widget.h"
  3. #include <QTextCodec>
  4. int main(int argc, char *argv[])
  5. {
  6. QApplication a(argc, argv);
  7. QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));
  8. QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
  9. QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
  10. Widget w;
  11. w.show();
  12. return a.exec();
  13. }

哦,这个案例的界面是我用Qt Designer拖出来的,所以没有代码部分。请大家借助下面的效果图查看源码。
再给大家展示上运行的效果图:

QProcess 进程类—调用外部程序的更多相关文章

  1. C#使用Process类调用外部程序(转)

    在程序开发中,一个程序经常需要去调用其他的程序,C#中Process类正好提供了这样的功能.它提供对本地和远程进程的访问并使您能够启动和停止本地系统进程.一.启动进程实例 Process myProc ...

  2. C#Process调用外部程序

    前言 使用C#调用外部程序,一种是通过Process类,一种是通过命令行,本文主要说一下使用C#中的Process类调用外部程序的方式. 过程: 1. 创建Process对象 2. 配置启动选项(输入 ...

  3. QProcess调用外部程序方式的差异

    众所周知QProcess类的作用是启动一个外部的程序并与之交互它有三种方式调用外部程序: 1. execute 2. start 3. startDetached 从调用上看: execute是阻塞调 ...

  4. PowerShell中调用外部程序和进程操作命令例子

    学习PowerShell,我们不指望通过C#编程去搞定所有事情,我们应该记住cmd.exe或者说批处理给我们留下的宝贵财富——通过调用外部程序去解决问题.调用了外部程序,势必就要对进程进行管理,这就是 ...

  5. 并发、并行、同步、异步、全局解释锁GIL、同步锁Lock、死锁、递归锁、同步对象/条件、信号量、队列、生产者消费者、多进程模块、进程的调用、Process类、

    并发:是指系统具有处理多个任务/动作的能力. 并行:是指系统具有同时处理多个任务/动作的能力. 并行是并发的子集. 同步:当进程执行到一个IO(等待外部数据)的时候. 异步:当进程执行到一个IO不等到 ...

  6. JAVA中调用外部程序,并等待其退出(涉及Runtime和ProcessBuilder)

    这段时间要写一个java调用外部程序的功能,踩了几个坑,这里分享一下. 首先用的是RunTime,调用代码如下: Process pro = Runtime.getRuntime().exec(&qu ...

  7. Delphi 调用外部程序并等待其运行结束

    转自:http://blog.csdn.net/xieyunc/article/details/4140620   如何让Delphi调用外部程序并等待其运行结束 1. uses     Window ...

  8. Wayland中的跨进程过程调用浅析

    原文地址:http://blog.csdn.net/jinzhuojun/article/details/40264449 Wayland协议主要提供了Client端应用与Server端Composi ...

  9. C# 使用Process调用外部程序中所遇到的参数问题

    在使用Process.Start 调用外部程序时,除了程序的地址之外,是可以传递参数的,Process.Start 也有多个重载: // // 摘要: // 启动由包含进程启动信息(例如,要启动的进程 ...

随机推荐

  1. 开机启动遇到grub rescue,无法启动系统解决方法

    先使用ls命令,找到Ubuntu的安装在哪个分区: grub rescue>ls 会罗列出磁盘信息 (hd0)  (hd0,msdos9) (hd0,msdos8) (hd0,msdos7).. ...

  2. 谷歌Dremel即时数据分析解决方案

    Hadoop技术已经无处不在.不管是好是坏,Hadoop已经成为大数据的代名词.短短几年间,Hadoop从一种边缘技术成为事实上的标准.看来,不仅现在Hadoop是企业大数据的标准,而且在未来,它的地 ...

  3. 淘淘商城_day04_课堂笔记

    今日大纲 实现首页的大广告位功能 实现内容管理系统 首页的大广告 什么是大广告 JS效果: 点击下面的序号选择查询哪个广告 自动切换 点击图片查询具体的页面 以上是由前端团队来开发. 数据结构 说明: ...

  4. HDU2363 最短路+贪心

    Cycling Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  5. python 豆瓣图片的爬取

    豆瓣图片的抓取:在python中实现生产者和消费者模型的实现,大家可以参考这篇文章 http://www.bkjia.com/Pythonjc/978391.html 个人认为是讲的比较易懂的,只要看 ...

  6. 大数据时代之hadoop(六):hadoop 生态圈(pig,hive,hbase,ZooKeeper,Sqoop)

    hadoop是有apache基金会所开发的分布式系统基础架构,其主要提供了两方面的功能:分布式存储和分布式计算. 其中分布式存储是分布式计算的基础,在hadoop的实现里面,提供了分布式存储的接口,并 ...

  7. 《JS权威指南学习总结--第九章 类和模板》

    内容要点: 一. 1.第六章详细介绍了JS对象,每个JS对象都是一个属性集合,相互之间没有任何联系.在JS中也可以定义对象的类,让每个对象都共享某些属性,这种"共享"的特性是非常有 ...

  8. 6、Web应用程序中的安全向量 -- customErrors(适当的错误报告和堆栈跟踪)

    几乎所有的网站在开发过程中都在web.config文件中设置了特性<customErrors mode="off">. customErrors模式有3个可选的设置项: ...

  9. openwrt下关于snmpd的一些信息

    cd /tmp/ 上传: tftp -gr libnetsnmp_5.4.4-1_ar71xx.ipk 192.168.11.56 安装: opkg install libnetsnmp_5.4.4- ...

  10. Gentoo安装详解(一) -- 安装基本系统

    前期准备 远程登录: 开启ssh服务: /etc/init.d/sshd start 设置密码: passwd 以便使用putty.ssh client远程登录上传stage等(有时在线下载很慢,而局 ...