使用QT中的QProcess类来启动一个外部·程序并与其进行通信。
要启动一个进程,可以使用start()函数,然后传递给该函数程序名称和运行这个程序所要使用的命令行参数。
执行完start函数,QProcess进入Starting状态,程序运行后QProcess进入Running状态并发射started()信号。进程退出后,QProcess重新进入NotRunning状态(初始状态)并发射finished()信号,这个信号提供了进程的退出代码和退出状态。
可以使用exitCode()来获取上一个结束进程的退出代码,使用exitStatus()来获取退出状态。
当任何时候发生错误,QProcess都会发生发射error()信号。可以使用error()来查看错误的类型和上次发生的错误。使用state()来查看当前进程的状态。
单进程案例(1)在VS中新建QT项目,名称为QProcess_1,然后在ui界面拖入push button,文本修改为“启动一个进程”。
(2)进入QProcess_1.h文件,先添加头文件#include <QProcess>,然后添加私有对象定义:QProcess myProcess。然后给(1)中的push button添加槽函数void on_pushButton_clicked()声明,并在cpp文件中给出详细定义(同时也要在ui界面中完成槽函数和push button的关联)
void QProcess_1::on_pushButton_clicked(){QString program = "cmd.exe";QStringList argumentes;argumentes << "/c dir&pause";myProcess.start(program, argumentes);}其中program为程序名称,arguments为命令行参数。命令行参数使用"/c dir&pause",这里的"/c"指定命令dir在cmd中执行,"&pause"指定运行命令后暂停。
(3)步骤二使用cmd执行了一个命令dir,可以用QProcess的一些信号进行关联。
在QProcess_1.h文件中添加私有槽声明:
void showResult();void showState(QProcess::ProcessState);void showError();void showFinished(int,QProcess::ExitStatus);在cpp文件中的构造函数中添加信号与槽的关联:
QProcess_1::QProcess_1(QWidget *parent): QMainWindow(parent){ui.setupUi(this);connect(&myProcess, SIGNAL(readyRead()), this, SLOT(showResult()));connect(&myProcess, SIGNAL(stateChanged(QProcess::ProcessState)), this, SLOT(showState(QProcess::ProcessState)));connect(&myProcess, SIGNAL(error(QProcess::ProcessError)), this, SLOT(showError()));connect(&myProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(showFinished(int, QProcess::ExitStatus)));connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(on_pushButton_clicked()));}(4)完整程序代码:
QProcess_1.h
#pragma once#include <QtWidgets/QMainWindow>#include "ui_QProcess_1.h"#include <QProcess>class QProcess_1 : public QMainWindow{Q_OBJECTpublic:QProcess_1(QWidget *parent = Q_NULLPTR);private:Ui::QProcess_1Class ui;QProcess myProcess;private slots:void on_pushButton_clicked();void showResult();void showState(QProcess::ProcessState);void showError();void showFinished(int,QProcess::ExitStatus);};QProcess_1.cpp
#include "QProcess_1.h"#include <QDebug>QProcess_1::QProcess_1(QWidget *parent): QMainWindow(parent){ui.setupUi(this);connect(&myProcess, SIGNAL(readyRead()), this, SLOT(showResult()));connect(&myProcess, SIGNAL(stateChanged(QProcess::ProcessState)), this, SLOT(showState(QProcess::ProcessState)));connect(&myProcess, SIGNAL(error(QProcess::ProcessError)), this, SLOT(showError()));connect(&myProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(showFinished(int, QProcess::ExitStatus)));connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(on_pushButton_clicked()));}void QProcess_1::on_pushButton_clicked(){QString program = "cmd.exe";QStringList argumentes;argumentes << "/c dir&pause";myProcess.start(program, argumentes);}void QProcess_1::showResult(){qDebug() << "showResult:" << endl << QString(myProcess.readAll());}void QProcess_1::showState(QProcess::ProcessState state){qDebug() << "showState";if (state == QProcess::NotRunning)qDebug() << "NotRunning";else if(state== QProcess::Starting)qDebug() << "Starting";elseqDebug() << "Running";}void QProcess_1::showError(){qDebug() << "showError:" << endl << myProcess.errorString();}void QProcess_1::showFinished(int exitCode, QProcess::ExitStatus exitStatus){qDebug() << "showFinished:" << endl << exitCode << exitStatus;}其中readAll()函数可以读取所有的运行结果。
main.cpp
#include "QProcess_1.h"#include <QtWidgets/QApplication>#include <QTextCodec>int main(int argc, char *argv[]){QApplication a(argc, argv);QProcess_1 w;//QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());w.show();return a.exec();}(5) 执行结果
在windows下真实使用dir的结果: