QT多进程编程

单个进程

使用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,文本修改为“启动一个进程”。

QT多进程编程_第1张图片

(2)进入QProcess_1.h文件,先添加头文件#include ,然后添加私有对象定义: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 
#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的结果:

QT多进程编程_第2张图片

 

 

 

你可能感兴趣的:(QT)