QProcess 进程类—调用外部程序

http://blog.csdn.net/newbee520/article/details/8279101

启动一个新的进程的操作非常简单,只需要将待启动的程序名称和启动参数传递给start()函数即可.

例如:

[cpp] view plain copy

  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()函数可以把标准输出通道和标准输错误通道合并

[cpp] view plain copy

  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. }

[cpp] view plain copy

  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"头文件

[cpp] view plain copy

  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"源文件

[cpp] view plain copy

  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"源文件

[cpp] view plain copy

  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拖出来的,所以没有代码部分。请大家借助下面的效果图查看源码。
再给大家展示上运行的效果图:

时间: 2024-10-03 14:41:47

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

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

在程序开发中,一个程序经常需要去调用其他的程序,C#中Process类正好提供了这样的功能.它提供对本地和远程进程的访问并使您能够启动和停止本地系统进程. 一.启动进程实例 Process myProcess = new Process(); try { myProcess.StartInfo.UseShellExecute = false; myProcess.StartInfo.FileName = "test.exe"; myProcess.StartInfo.CreateNoW

Java使用ProcessBuilder类调用外部程序

1. demo1 @Test public void testProcessBuilder() { ProcessBuilder processBuilder = new ProcessBuilder(); // processBuilder.command("ping","127.0.0.1"); processBuilder.command("ipconfig"); //将标准输入流和错误输入流合并,通过标准输入流读取信息 processBu

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

学习PowerShell,我们不指望通过C#编程去搞定所有事情,我们应该记住cmd.exe或者说批处理给我们留下的宝贵财富——通过调用外部程序去解决问题.调用了外部程序,势必就要对进程进行管理,这就是本文要介绍的. 1.Get-Process,返回进程. Get-Process [-id] ,按pid获取Get-Process -name ,按进程名Get-Process -inputObject ,传入参数 举例:get-process -name mmc,显示所有mmc的进程. 2.Star

Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用

在上一篇文章Android IPC机制(二)用Messenger进行进程间通信中我们介绍了使用Messenger来进行进程间通信的方法,但是我们能发现Messenger是以串行的方式来处理客户端发来的信息,如果有大量的消息发到服务端,服务端仍然一个一个的处理再响应客户端显然是不合适的.另外,Messenger用来进程间进行数据传递但是却不能满足跨进程的方法调用,接下来我们来使用AIDL来实现跨进程方法调用,此前我们都是用Eclipse来实现的,这次我们看看在Android Studio中使用AI

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

原文地址:http://blog.csdn.net/jinzhuojun/article/details/40264449 Wayland协议主要提供了Client端应用与Server端Compositor的通信机制,Weston是Server端Compositor的一个参考实现.Wayland协议中最基础的是提供了一种面向对象的跨进程过程调用的功能,在作用上类似于Android中的Binder.与Binder不同的是,在Wayland中Client和Server底层通过domain socke

Windows API调用外部程序之图片查看

最近顺手接了一个小活,任务目标是将一组图像依次显示出来.环境就是XP中,代码嵌入到一个MFC工程里,图片是未经处理的可能是JPEG2000格式的j2c,也可能是bitmap.当然还可能没有任何的文件头,这个最后看实际情况再添加吧. 主要就是调用外部程序(j2c可以用网上的ivanview或kakadu,bmp就用Windows的图片查看工具),打开/关闭这两个功能.文件便利可以用CFileFind类,这里用的FindFirstFile和FindNextFile. 打开可以使用system(),还

Wayland (三) Wayland中的跨进程过程调用浅析 [FW]

原文地址:http://blog.csdn.net/jinzhuojun/article/details/40264449 Wayland协议主要提供了Client端应用与Server端Compositor的通信机制,Weston是Server端Compositor的一个參考实现.Wayland协议中最基础的是提供了一种面向对象的跨进程过程调用的功能,在作用上类似于Android中的Binder.与Binder不同的是,在Wayland中Client和Server底层通过domain socke

C# 客户端程序调用外部程序的三种实现

简介 我们用C#来开发客户端程序的时候,总会不可避免的需要调用外部程序或者访问网站,本篇博客介绍了三种调用外部应用的方法,供参考 实现 第一种是利用shell32.dll,实现ShellExecute方法,该方法可同时打开本地程序.文件夹或者访问网站,只要直接输入路径字符串即可, 如C:\Users\Desktop\xx.exe或者https://cn.bing.com/,可以根据返回值判断是否调用成功 (成功0x00000002a , 失败0x00000002) Window wnd = Wi

52.C#--进程类

namespace _52进程类{class Program{static void Main(string[] args){//通过一个进程打开指定的文件//首先拿到要打开文件的路径ProcessStartInfo psi = new ProcessStartInfo(@"C:\Users\Administrator.USER-20180925HC\Desktop\pic\1.txt");//其次创建进程对象Process p = new Process();//将路径给到进程p.S