zoukankan      html  css  js  c++  java
  • QProcess 进程类—调用外部程序

    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.   
    6. int main(int argc, char *argv[])  
    7. {  
    8.     QApplication app(argc, argv);  
    9.   
    10.     QProcess proc;  
    11.     QStringList arguments;  
    12.     arguments << "-na";  
    13.     proc.start("netstat", arguments);  
    14.   
    15.     // 等待进程启动  
    16.     if (!proc.waitForStarted())  
    17.     {  
    18.         std::cout << "启动失败 ";  
    19.         return false;  
    20.     }  
    21.     // 关闭写通道,因为没有向进程写数据,没用到   
    22.     proc.closeWriteChannel();  
    23.   
    24.     // 用于保存进程的控制台输出  
    25.     QByteArray procOutput;  
    26.     // 等待进程结束  
    27.     while (false == proc.waitForFinished())  
    28.     {  
    29.        std::cout << "结束失败 ";  
    30.        return 1;  
    31.     }   
    32.     // 读取进程输出到控制台的数据   
    33.    procOutput = proc.readAll();  
    34.    // 输出读到的数据   
    35.    std::cout << procOutput.data() << std::endl;  
    36.    // 返回   
    37.    return EXIT_SUCCESS;  
    38. }  
    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.   
    6. namespace Ui {  
    7.     class Widget;  
    8. }  
    9.   
    10. class Widget : public QWidget  
    11. {  
    12.     Q_OBJECT  
    13.   
    14. public:  
    15.     explicit Widget(QWidget *parent = 0);  
    16.     ~Widget();  
    17.   
    18. private:  
    19.     Ui::Widget *ui;  
    20.     QProcess *pro;//创建一个进程对象  
    21.     QString out;  
    22. private slots:  
    23.     void on_pushButton_clicked();//运行按钮槽  
    24.     void readOutput();//从进程中读取数据槽  
    25. };  
    26.   
    27. #endif // WIDGET_H  

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

    "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.   
    13.     return a.exec();  
    14. }  
    哦,这个案例的界面是我用Qt Designer拖出来的,所以没有代码部分。请大家借助下面的效果图查看源码。
    再给大家展示上运行的效果图:


  • 相关阅读:
    (Good Bye 2019) Codeforces 1270B Interesting Subarray
    (Good Bye 2019) Codeforces 1270A Card Game
    Codeforces 1283D Christmas Trees(BFS)
    Codeforces 1283C Friends and Gifts
    Codeforces 1283B Candies Division
    1095 Cars on Campus (30)
    1080 Graduate Admission (30)
    1099 Build A Binary Search Tree (30)
    1018 Public Bike Management (30)
    1087 All Roads Lead to Rome (30)
  • 原文地址:https://www.cnblogs.com/senior-engineer/p/5597788.html
Copyright © 2011-2022 走看看