使用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
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
#include "ui_QProcess_1.h"
#include
class QProcess_1 : public QMainWindow
{
Q_OBJECT
public:
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
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";
else
qDebug() << "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
#include
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的结果: