QProcess
最后更新于:2022-04-02 02:12:50
[TOC]
## 概述
1. QProcess是一个能够非常方便而且跨平台)的用于启动和控制其他进程的类。它从Qobject派生而来,可充分利用信号和槽来简化与其他Qt类的“交互”。
2. 一个 QProcess可以使用stat()函数来启动另外一个进程。新进程将会成为一个子进程并且在父进程终止时而随之终止。
3. startDetached() 函数来启动一个在父进程结束之后任能存活的进程
**子进程**
- 子进程可以看成是一个预先定义了两个输出通道的顺序 IO 设备,这两个输出通道分别代表了两个独立的数据流: stdout和 stderr。
- 父进程可以使用函数 setReadchanne()来选择一个输出通道(默认是 stdout)。当子进程中被选中通道的数据可用时,它将会发射出信号 readyRead()。
- 此时父进程就可以通过调用函数read(), readline()或者getchar()来读取其输出结果。
- 如果子进程启用了标准输人,那么父进程就可以使用 write()函数向其发送数据。
## 示例
### Hello World
```
QObject *parent;
...
QString program = "./path/to/Qt/examples/widgets/analogclock";
QStringList arguments;
arguments << "-style" << "fusion";
QProcess *myProcess = new QProcess(parent);
myProcess->start(program, arguments);
```
### 调用 gzip 压缩
```
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();
```
### 启动 监听 tail -f
#include
class LogTail : public QProcess
{
Q_OBJECT
public:
LogTail(QString fn){
if(fn.isEmpty()){
return;
}
// 有要读取的数据,触发
connect(this,&LogTail::readyReadStandardOutput,this,&LogTail::logoutput);
QStringList argv;
argv<<"-f"<
#include
#include
#include
#include "logtail.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QStringList args = a.arguments();
QTextEdit textEdit;
textEdit.setWindowTitle("Debug");
QString filename;
if(args.size()>1){
filename=args[1];
qDebug()<<"filename "<
### 给进程设置环境变量 环境变量和它们的值通常由父进程设置 ``` QProcess process; QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); env.insert("TMPDIR", "C:\\MyApp\\temp"); // Add an environment variable process.setProcessEnvironment(env); process.start("myapp"); ```
';
logtail.h
```#ifndef LOGTAIL_H #define LOGTAIL_H #includemain.cpp
``` #include### 给进程设置环境变量 环境变量和它们的值通常由父进程设置 ``` QProcess process; QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); env.insert("TMPDIR", "C:\\MyApp\\temp"); // Add an environment variable process.setProcessEnvironment(env); process.start("myapp"); ```