一、说明
- 简单使用:在一个函数中,使用QProcess类的临时对象调用可执行文件exe,只有这个exe执行完了,这个函数才往下执行,一次性打印出exe所有输出信息;
- 复杂使用:创建QProcess类的全局对象,在一个函数中,调用可执行文件exe,不用等exe执行完,这个函数就可以往下执行,实时打印输出相关信息;
注:此文讲解复杂使用方式,简单使用方式见上一篇。
二、添加复杂使用项目
在简单使用的基础上创建复杂使用项目
右击项目名称,选择“新子项目”
选择项目模板
更改项目名
默认
默认,点击“完成”
在ComplexUse.pro中添加如下代码,更改可执行文件生成位置
CONFIG(debug , debug | release) {
win32:!wince{
DESTDIR = $$PWD/../bin_debug
}
unix {
DESTDIR = $$PWD/../bin_debug_linux
}
} else {
win32:!wince{
DESTDIR = $$PWD/../bin_release
}
unix {
DESTDIR = $$PWD/../bin_release_linux
}
}
在mainwindow.ui界面上添加一个QPushButton,并转到槽
更改maincppwindow.h中的代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QProcess>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void showResult(); //进程输出数据
void showState(QProcess::ProcessState); //进程运行状态
void showError(QProcess::ProcessError); //进程运行错误
void showFinished(int, QProcess::ExitStatus); //进程完成情况
void showReadyReadStandardErro(); //被调用程序里的错误
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
QProcess m_process;
};
#endif // MAINWINDOW_H
更改mainwindow.cpp中的代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QTextCodec>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(&m_process, &QProcess::readyRead, this, &MainWindow::showResult);
connect(&m_process, &QProcess::stateChanged, this, &MainWindow::showState);
connect(&m_process, &QProcess::errorOccurred, this, &MainWindow::showError);
connect(&m_process, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(showFinished(int,QProcess::ExitStatus)));
connect(&m_process, &QProcess::readyReadStandardError, this, &MainWindow::showReadyReadStandardErro);
}
MainWindow::~MainWindow()
{
delete ui;
}
/**
* @brief MainWindow::on_pushButton_clicked 点击按钮,用进程调用其他的exe
*/
void MainWindow::on_pushButton_clicked()
{
QString program = QApplication::applicationDirPath() + "/test.exe";
QStringList argument;
argument << "11" << "22" << "33";
m_process.start(program, argument); //此程序关闭,program程序也关闭
//此程序关闭,program程序仍然可以执行
//m_pProcess.startDetached(program, argument);
}
/**
* @brief MainWindow::showResult 进程输出数据
*/
void MainWindow::showResult()
{
QTextCodec* codec = QTextCodec::codecForLocale();
qDebug() << "showResult: " << endl << codec->toUnicode(m_process.readAll());
}
/**
* @brief MainWindow::showState 进程运行状态
* @param state
*/
void MainWindow::showState(QProcess::ProcessState state)
{
qDebug() << "showState: ";
if(state == QProcess::NotRunning)
{
qDebug() << "Not Running";
}
else if(state == QProcess::Starting)
{
qDebug() << "Starting";
}
else
{
qDebug() << "Running";
}
}
/**
* @brief MainWindow::showError 运行错误
*/
void MainWindow::showError(QProcess::ProcessError er)
{
switch (er)
{
case QProcess::FailedToStart:
qDebug() << "QProcess::FailedToStart";
break;
case QProcess::Crashed:
qDebug() << "QProcess::Crashed";
break;
case QProcess::Timedout:
qDebug() << "QProcess::Timedout";
break;
case QProcess::WriteError:
qDebug() << "QProcess::WriteError";
break;
case QProcess::ReadError:
qDebug() << "QProcess::ReadError";
break;
case QProcess::UnknownError:
qDebug() << "QProcess::UnknownError";
break;
}
}
/**
* @brief MainWindow::showFinished 进程完成情况
* @param exitCode
* @param exitStatus
*/
void MainWindow::showFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
qDebug() << "showFinished: " << endl << exitCode << exitStatus;
}
/**
* @brief MainWindow::showReadyReadStandardErro 被调用程序里的错误
*/
void MainWindow::showReadyReadStandardErro()
{
qDebug() << "showReadyReadStandardErro: " << endl << m_process.readAllStandardError();
}
三、运行测试
运行ComplexUse程序,点击pushButton,输出如下