1. 程式人生 > >Qt文件閱讀筆記-Qt工作筆記QProcess::finished的解析與例項

Qt文件閱讀筆記-Qt工作筆記QProcess::finished的解析與例項

目錄

官方解析

博主例子

官方解析

void QProcess::finished(int exitCode, QProcess::ExitStatus exitStatus)

這個訊號是當process完成時候才發射的。exitCode是程序退出的程式碼(指有效的退出,程式崩潰導致的退出無效),並且exitStatus得到了返回值的狀態(如return 1,return 0),當程序完成了以後,QProceess裡面的快取區任然是完整的。完成了之後也可以讀取他的資料,並且這個資料是事實的,並不是當程式完成,這個快取區才會有資料。 Note:finished這個訊號在QProcess類中被過載了。使用函式指標的語法去連線這個這個訊號,必須在靜態轉化(static cast)中指定其型別,如下面這個栗子!  

connect(process, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
      [=](int exitCode, QProcess::ExitStatus exitStatus){ /* ... */ });

博主例子

外部程式原始碼如下:

#include <iostream>
#include <windows.h>
using namespace std;

int main(){

	//Analog data processing
	for(int i=0;i<10;i++){
		cout<<"How are you?"<<endl;
		cout<<"How old are you?"<<endl;
		Sleep(1000);
	}
	return 100;
}

本程式在本次例子的這個路徑中:E:\\vs2012\\QtTestDemo\\Debug\\QtTestDemo.exe

阻塞主程式執行外部程式

原始碼如下:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

    void executeOtherProcess();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QProcess>
#include <QDebug>
#include <QMessageBox>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    executeOtherProcess();
}

Widget::~Widget()
{
    delete ui;
}

void Widget::executeOtherProcess()
{
    QProcess p;
    QString cmdString="E:\\vs2012\\QtTestDemo\\Debug\\QtTestDemo.exe";
    p.start("cmd",QStringList()<<"/c"<<cmdString);
    p.waitForStarted();
    p.waitForFinished();
    QString getStr=QString(p.readAllStandardOutput());
    QMessageBox::information(this,"提示",getStr);
}

使用本地事件迴圈不阻塞主程式執行外部程式

使用QEventLoop加應該finished訊號就可以完成這個功能(比線上程裡面還簡單)

這裡要注意:當介面起來後,再使用本地事件迴圈!

執行截圖如下:

原始碼如下:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void on_pushButton_clicked();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QProcess>
#include <QDebug>
#include <QEvent>
#include <QMessageBox>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_pushButton_clicked()
{
    QProcess p;
    QString cmdString="E:\\vs2012\\QtTestDemo\\Debug\\QtTestDemo.exe";
    p.start("cmd",QStringList()<<"/c"<<cmdString);
    QEventLoop loop;
    connect(&p,SIGNAL(finished(int,QProcess::ExitStatus)),&loop,SLOT(quit()));
    loop.exec();
    QString getStr=QString(p.readAllStandardOutput());
    QMessageBox::information(this,"提示",getStr);
}