Qt文件閱讀筆記-Qt工作筆記QProcess::finished的解析與例項
阿新 • • 發佈:2018-12-10
目錄
官方解析
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);
}