版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
}