QProcess是一个为进程间通信创建的类。在linux相关系统中,可以很方便地用它调用执行命令。
它继承自QIODevice.可以想像,它对其它进程的操作方式,就像读写一个文件一样方便。
下面浏览它的公共函数:
QProcess(QObject * parent = 0)
virtual ~QProcess()
void setProgram(const QString & program)//设置需要打开的进程
void setArguments(const QStringList & arguments)//设置参数部分
void setInputChannelMode(InputChannelMode mode)
void setReadChannel(ProcessChannel channel)//设置输出通道。下边解释1
void setNativeArguments(const QString & arguments)
void setProcessChannelMode(ProcessChannelMode mode)
void setProcessEnvironment(const QProcessEnvironment & environment)
void start(const QString & program, const QStringList & arguments, OpenMode mode = ReadWrite)//较常用,直接启动运行某个进程并传入参数
void start(OpenMode mode = ReadWrite)
void start(const QString & command, OpenMode mode = ReadWrite)
QByteArray readAllStandardError()//从输出中得到被操作程序的输出内容。输出时有标准错误输出和标准输出两个管道
QByteArray readAllStandardOutput()
void setStandardErrorFile(const QString & fileName, OpenMode mode = Truncate)//与readAllStandardXXX函数相似,只是将程序的输出保存到文件中。设置以下几个后,就read不到相应管道中的内容了。
void setStandardInputFile(const QString & fileName)
void setStandardOutputFile(const QString & fileName, OpenMode mode = Truncate)
void setStandardOutputProcess(QProcess * destination)
void setWorkingDirectory(const QString & dir)
QProcess::ProcessState state() const
bool waitForFinished(int msecs = 30000)
bool waitForStarted(int msecs = 30000)
QString workingDirectory() const
QStringList arguments() const
void closeReadChannel(ProcessChannel channel)
void closeWriteChannel()
QProcess::ProcessError error() const
int exitCode() const
QProcess::ExitStatus exitStatus() const
InputChannelMode inputChannelMode() const
QString nativeArguments() const
Q_PID pid() const
ProcessChannelMode processChannelMode() const
QProcessEnvironment processEnvironment() const
QString program() const
ProcessChannel readChannel() const
1,enum QProcess::ProcessChannel
Constant | Value | Description |
QProcess::StandardOutput默认 | 0 | standard output (stdout) 标准输出 |
QProcess::StandardError | 1 | standard error (stderr) 标准错误输出 |
对于一些继承来的操作函数,如:read(), readAll(), readLine(), 和 getChar(),它们读取时,只能从两个通道中的一个读取得到被操纵程序的标准输出。
可以通过连接信号得到progress的状态:
Signals
void | error(QProcess::ProcessError error) |
void | finished(int exitCode, QProcess::ExitStatus exitStatus) |
void | |
void | |
void | started() |
void | stateChanged(QProcess::ProcessState newState) |
它的一些静态函数:
Static Public Members
int | execute(const QString & program, const QStringList & arguments)//阻塞式,直到progress退出 |
int | execute(const QString & program) |
QString | |
bool | startDetached(const QString & program, const QStringList & arguments, const QString & workingDirectory, qint64 * pid |
bool | startDetached(const QString & program, const QStringList & arguments) |
bool | startDetached(const QString & program) |
QStringList | systemEnvironment()//一个有用的获取系统环境变量的函数。使用如:QStringList environment = QProcess::systemEnvironment(); // environment = {"PATH=/usr/bin:/usr/local/bin", // "USER=greg", "HOME=/home/greg"} |
————————————————————————————————————————————————————————
下面用mentohust程序举一个它的典型用法:
QString program = "/usr/bin/mentohust";
QStringList arguments;
arguments << "-h";
QProcess *myProcess = new QProcess(parent);
myProcess->start(program, arguments);
mentohust是一个校园网认证的工具,在linux中只有后台,没有UI。使用时可在shell中输入mentohust -h。可以得到帮助信息。上面代码的结果是一样的。
这样启动后,可以用write函数向其写入内容,通过readyReadStandardOutput()等信号连到槽函数,然后用readAllStandardOutput()等读函数读取输出进行处理。
给出一个它的参数的详细链接:https://code.google.com/p/mentohust/wiki/Parameter。可用它试试。或网上有操控MPlayer的,百度下。
————————————————————————————————————————————————————————
接下来看它的更高级用法,以更深理解它:
简单控制台程序
方向 | 途径 | |
获取 | 命令行参数 | int main(int argc, char **argv) |
标准输入 | scanf()/getc()/getchar()/... | |
环境变量 | getenv() | |
输出 | 标准输出 | printf() ... |
标准出错 | fprintf(stderr,...) | |
返回值 | return(x)/exit(X)/_Exit(X) |
命令行参数
#include <stdio.h>
int main(int argc, char **argv)
{
for (int i=1; i<argc; ++i)
printf("%s\n", argv[i]);
return 0;
}
$ ./process a b "c d"
a
b
c d
QProcess process;
process.start("./process", QStringList()<<"a"<<"b");
process.start("./process a b");
- QProcess::setNativeArguments()
标准输出
$./process a b "c d" > out.txt
QProcess::readAllStandardOutput () | 获取标准输出 |
QProcess::setStandardOutputFile() | 设置输出到的文件,相当于前面的重定向 |
QProcess process;
process.start("./process", QStringList()<<"a"<<"b");
process.readAllStandardOutput();
- QProcess::setStandardOutputProcess()
ls -l | more 这样的管道操作
- read()
- readLine()
- ...
禁止缓冲
注意:如果写的控制台程序准备用于这种途径,且需要实时被读取标准输出,那么一般该程序内需要禁用缓冲
int main()
{
setvbuf(stdout, (char *)NULL, _IONBF, 0);
return 0;
}
标准出错
#include <stdio.h>
int main(int argc, char **argv)
{
fprintf(stdout, "Hello STDOUT!\n");
fprintf(stderr, "Hello STDERR!\n");
return 0;
}
$ ./process
Hello STDOUT!
Hello STDERR!
$ ./process > out.txt
Hello STDERR!
$ ./process > out.txt 2>err.txt
$
- QProcess::readAllStandardError()
- QProcess::setStandardErrorFile()
QProcess process;
process.start("./process", QStringList()<<"a"<<"b");
process.readAllStandardOutput();
- QProcess::setReadChannel()
标准输入
#include <stdio.h>
int main(int argc, char **argv)
{
char contents[1024];
fgets(contents, 1024, stdin);
printf("output: %s", contents);
return 0;
}
$ ./process
1+1=2
output: 1+1=2
$ ./process < intput.txt
output: contents of input.txt
QProcess process;
process.start("./process")
process.write("intput");
- QProcess::setStandardInputFile()
返回值
int main()
{
return 0;
}
C:\> process.exe
C:\> echo %errorlevel%
$ ./process
$ echo $?
- int QProcess::execute()
- int QProcess::exitCode()
环境变量
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
char * path = getenv("MYPATH");
printf("MYPATH= %s\n", path);
return 1;
}
$ export MYPATH="/home/dbzhang800"
$ ./process
MYPATH= /home/dbzhang800
C:\> set MYPATH=E:\dbzhang800
C:\> process.exe
MYPATH= E:\dbzhang800
QProcess process;
QProcessEnvironment env;
env.insert("MYPATH", "/home/dbzhang800");
process.setProcessEnvironment(env);
process.start("./process");