Qt 5 . 6 文档翻译:QProcess类,QProcess Class
QProcess类用于启动外部程序并且与它们通信。
要启动一个进程 ,将你想要运行的程序的名字和命令行参数传递给 start () 。参数是以一个 QStringList 中的单独的字符串的形式传递的 。
或者 , 也可以通过 setProgram ()和 setArguments ()来设置要运行的程序,然后调用 start ()或 open ()。
例如
,下面的代码段通过将包含"-style"和"
fusion
"的字符串以参数列表中的两个条目的方式传递给程序来在X11平台上以
Fusion
样式运行模拟时钟示例:
QObject *parent;
...
QString program = "./path/to/Qt/examples/widgets/analogclock";
QStringList arguments;
arguments << "-style" << " fusion ";
QProcess *myProcess = new QProcess(parent);
myProcess->start(program, arguments);
接下来QProcess进入 Starting状态,并且当程序启动成功后,QProcess进入 Running状态并且发射started () 。
QProcess允许你将一个进程当作一个顺序的输入输出设备 。你可以向一个进程写入或者从一个进程读出数据 ,就像你使用 QTcpSocket 来访问一个网络连接一样。接下来你可以通过调用 write ()来向进程的标准输入写入内容 ,以及通过调用 read ()、 readLine ()和 getChar ()来从标准输出读出内容。因为它继承了 QIODevice , QProcess还可以用来作为 QXmlReader 的一个输入源 ,或者用来生成将会使用 QNetworkAccessManager 来上 传的数据。
当进程退出后 , QProcess重新进入 NotRunning状态(初始状态),并且发射finished () 。
finished ()信号提供进程的退出码和退出状态作为参数 ,而且你也可以调用 exitCode ()来获取最后结束的进程的退出码 ,调用 exitStatus ()来获取它的退出状态 。如果在这个过程中有任何的错误发生 , QProcess会发射 errorOccurred () 信号 。你也可以调用 error ()来获取最后发生的错误的类型,调用 state ()来获取当前进程的状态 。
进程有两个预定义的 输出 通道 :标准输出通道 ( stdout )提供常规的终端输出 ,标准错误通道 ( stderr )通常提供由进程输出的错误 。这两个通道代表 两个独立的数据流。你可以通过调用 setReadChannel ()来在二者之间切换。 在当前阅读通道上有数据时 ,QProcess 会发射 readyRead () 。它也在有新的标准输出数据的时候发射 readyReadStandardOutput () ,并且当有新的标准错误数据时 ,发射 readyReadStandardError () 。 除了 调用 read () 、 readLine ()或者 getChar ()之外,你 也 可以通过调用 readAllStandardOutput ()或者 readAllStandardError ()来显式地从两个通道中的 某 一个读取所有的数据 。
这里的术语通道可能会造成误解。注意进程的输出通道对应着QProcess的 读取 通道,而进程的输入通道对应着QProcess的 写 通道。这是因为我们使用QProcess读取的是进程的输出,而我们写入的成为进程的输入。
QProcess可以合并两个输出通道 ,以使正在运行的进程的标准输出和标准错误数据都使用标准输出通道。在开始进程之前以 MergedChannels 作为参数调用 setProcessChannelMode ()以启用这个特性 。你还可以通过传递 ForwardedChannels 参数来选择将正在运行的进程的输出转发到调用它的 主进程。 还可以仅仅转发其中一个输出通道—— 一般情况下会使用 ForwardedErrorChannel ,但是 ForwardedOutputChannel 也是可用的。注意 ,在图形界面程序中使用通道转发功能是个坏主意——妳应当以图形界面来呈现错误消息。
某些进程需要特定的环境变量设置以正常工作 。你可以通过调用 setProcessEnvironment () 来为你的进程设置环境变量 。要设置工作目录 ,调用 setWorkingDirectory () 。默认地 ,进程是在调用它们的进程的当前工作目录里面运行。
对于由 QProcess 启动的那些图形界面程序中的窗口,其位置和在屏幕上的层叠顺序(Z-order),是由底层窗口管理系统控制的。对于Qt 5程序,其位置可使用命令行参数 -qwindowgeometry 来指定;X11应用程序一般都会接受 -geometry 这个命令行参数。
同步的进程
API
QProcess 提供一组允许它在没有事件循环的情况下使用的函数,它们会挂起调用的线程直到特定的信号被发射:
• waitForStarted ()阻塞直到进程启动成功 。
• waitForReadyRead ()阻塞直到当前读取通道上有新的数据 。
• waitForBytesWritten ()阻塞直到负载的数据已经 被写入到进程中。
• waitForFinished ()阻塞直到进程结束 。
从主线程 (调用 QApplication::exec ()的线程) 调用这些函数可能导致你的用户界面冻结 。
下面的代码在没有事件循环的情况下运行 gzip 来压缩字符串"Qt rocks!" :
QProcess gzip;
gzip.start("gzip", QStringList() << "-c");
if (!gzip.waitForStarted())
return false;
gzip.write("Qt rocks!");
gzip.closeWriteChannel();
if (!gzip.waitForFinished())
return false;
QByteArray result = gzip.readAll();
参 考 QBuffer 、 QFile 和 QTcpSocket 。
这个枚举描述QProcess的不同的退出状态。
常量 |
值 |
描述 |
QProcess::NormalExit |
0 |
进程正常退出。 |
QProcess::CrashExit |
1 |
进程崩溃了。 |
参考 exitStatus()。
这个枚举描述的是 QProcess 报告的错误的种类。
常量 |
值 |
说明 |
QProcess::FailedToStart |
0 |
进程未能成功启动。可能原因:要调用的程序不存在,或者妳的权限不够。 |
QProcess::Crashed |
1 |
进程在成功启动之后,过了一段时间,崩溃了。 |
QProcess::Timedout |
2 |
最近调用的waitFor...()函数超时了。 QProcess 的状态未改变,妳仍然可以继续调用waitFor...()。 |
QProcess::WriteError |
4 |
尝试向进程写入内容时,发生了错误。比如说,进程可能未运行,也可能已经关闭了它的输入流。 |
QProcess::ReadError |
3 |
尝试从进程中读取内容时,发生了错误。比如说,进程可能未运行。 |
QProcess::UnknownError |
5 |
发生了未知错误。这是 error ()函数的默认返回值。 |
参考 error () 。
这个枚举描述的是 QProcess 的不同状态。
常量 |
值 |
说明 |
QProcess::NotRunning |
0 |
进程此时没有运行。 |
QProcess::Starting |
1 |
进程正在启动,但是对应的程序还没有被调用。 |
QProcess::Running |
2 |
进程正在运行,可以对它读写数据咯。 |
参考 state () 。
当进程退出时发射这个信号。 exitCode是进程的退出代码(只在正常退出的情况下有效), exitStatus是进程的退出状态。在进程结束后, QProcess 中的缓冲仍然是完整的。你仍然可以读取进程在结束之前可能写出的任何数据。
注意 :这个类中的finished信号有重载情况。要想使用函数指针语法来连接到这个信号的话,则,必须使用静态转换来指定信号类型,就像下面示例中这样:
connect(process, static_cast< void ( QProcess ::*)( int , QProcess ::ExitStatus)>(& QProcess ::finished),
[=]( int exitCode, QProcess ::ExitStatus exitStatus){ /* ... */ });
参考
exitStatus()。
将该进程的标准输出流管道到destination进程的标准输入流。
以下的命令行命令:
command1 | command2
可使用 QProcess 通过以下代码来实现:
QProcess process1;
QProcess process2;
process1.setStandardOutputProcess(&process2);
process1.start("command1");
process2.start("command2");
此函数从Qt 4.2 开始引入。
这个信号是由 QProcess 在进程开始之后并且 state ()返回 Running 的情况下发射的 。
注意 :这是一个私有信号。它可以在信号连接过程中使用,但是,不可以被用户发射。
QString
QProcess::workingDirectory () const
如果 QProcess被赋予一个工作目录,这个函数就会返回QProcess在程序开始之前将会进入的工作目录。否则,(也就是说,没有目录被赋值)会返回一个空字符串,并且QProcess会使用你的程序当前的工作目录。
参 考 setWorkingDirectory () 。
伊能 静,但伊不肯
未知美人
未知美人
Your opinionsHxLauncher: Launch Android applications by voice commands