Qt文档阅读笔记-Qt工作笔记QProcess::finished的解析与实例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq78442761/article/details/82751893

目录

官方解析

博主例子

阻塞主程序运行外部程序

使用本地事件循环不阻塞主程序运行外部程序


官方解析

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);
}

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/82751893