QPROCESS类用来启动外部程序并且与之进行通信。
要运行一个process,将你想运行的程序的名称和命令行参数作为start()的arguments. Arguments是作为QStringlist中单独的字符串来应用的。
例如,下面的代码片段在Motif style在X11平台上通过传递了两个包含"-style" and "motif"参数的参数列表来运行了一个analog clock example。
QObject *parent;
QString program ="./path/to/Qt/examples/widgets/analogclock";
QStringList arguments;
arguments << "-style"<< "motif";
QProcess *myProcess = newQProcess(parent);
myProcess->start(program, arguments);
QProcess然后进入了starting状态,当进程开始的时候,QProcess进入了运行模式并且发出started()信号。
QProcess允许你将一个process作为序列I/O 设备。 你可以读写进程就像你使用QTCPSocket进入网络连接一样。这时你可以通过调用write()写数据的标准输入, 通过调用read(),readline(), 和getchar()标准输出来读取。因为它继承了QIODevice, QProcess,同样可以用来作为QXmlReader的输入源,或者使用QFtp生成可被上传的数据。
注意:在windows CE和symbian, 读写进程是不支持的。
当进程退出的时候,QProcess重新进入了NotRunning状态(初始状态),并且发出finish();
finish()信号提供了进程的退码和退出状态,你也可以调用exitCode()来获取最后进程退出码,exitStatus()来获取他的退出状态。 如果期间发生错误,QProcess会发出error()信号。 你可以调用error()来找出最新发生错误的类型,和state()来找出当前进程状态。
通过channels来通信
进程有两个预定义的输出渠道:stdout(提供了标准console输出) 和stderr(通常提供进程输出地错误)。 这些驱动代表两种不同的数据流。你可以在setReadChannel()来对它们进行切换。当数据在当前频道可用的时候QProcess发出readyRead()。当新的标准输出数据可用的时候它也发出readyReadStandard(),当新的标准错误数据产生的时候,发出readyReadSrandardError(). 你也可以调用readAllStandardOutput()或者readAllStandardError()来读取所有的数据。
下面举个例子,用QProcess来调用cmd对某个qt工程进行编译
假设在C:\qtproject文件夹下有个compile.pro的工程
QProcess * process= newQProcess;
process->setWorkingDirectory("c:\\qtproject");
process->start("cmd");
process->waitingForStarted();
process->write("qmake compile.pro\n");
process->write("mingw32-make\n");
...
你就会发现在C:\qtproject文件夹下生成了makefile和debug等文件或文件夹。 这就完成了compile.pro工程的编译。
当然如果你想获取编译的信息, 也可以通过connect(cmd, SIGNAL(readyRead()), this, SLOT(你的函数()));来获取编译信息
以及 connect(cmd,SIGNAL(readyReadStandardError()),this,SLOT(你的函数()));来获取编译可能会发生的错误。