Qt提供了一个QProcess类用于启动外部程序并与之通信,启动一个新的进程的操作非常简单,只需要将待启动的程序名称和启动参数传递给start()函数即可.
当调用start()函数后,myProcess进程立即进入启动状态,但程序ls尚未被调用,不能读写标准输入输出设备.当进程完成启动后就进入"运行状态"并向外发出started()信号.在输入输出方面,QProcess将一个进程看做一个流类型的I/O设备,可以像使用QTcpSocket读写流类型的网络连接一样来读写一个进程.可以通过QIODevice::write()函数向所启动进程的标准输入写数据,也可以通过QIODevice::read()、QIODevice::readLine()和QIODevice::getChar()函数从这个进程的标准输出读数据.此外由于QProcess是从QIODevice类继承而来的,因四级,它也可以作QXmlReader的数据在源,或者为QFtp产生上传数据.最后,当进程退出时QProcess进入起始状态----"非运行状态",并发出finished()
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
QProcess myProcess;
QByteArray procOutput;
private slots:
void showResult();
void showState(QProcess::ProcessState);
void showError();
void showFinished(int,QProcess::ExitStatus);
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
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)));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
#if 1
QString cmd = ui->lineEdit->text();
myProcess.start(cmd);
#else
QString program="ls";
QStringList arguments;
arguments << "/home/linux/python";
myProcess.start(program,arguments);
//myProcess.startDetached() /* 启动外部程序不随主程序的退出而退出 */
#endif
// 等待进程启动
if (!myProcess.waitForStarted())
{
qDebug() << "启动失败\n";
return;
}
myProcess.closeWriteChannel();
}
void MainWindow::showResult()
{
//qDebug() << "shiwResult:" << endl << QString(myProcess.readAll());
procOutput = myProcess.readAll();
ui->textBrowser->setText(procOutput);
}
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";
}
}
void MainWindow::showError()
{
qDebug() << "showError:" << endl <