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
logtail.h ```#ifndef LOGTAIL_H #define LOGTAIL_H #include #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"<
main.cpp ``` #include #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"); ```
';