ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[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 <details> <summary> logtail.h</summary> ```#ifndef LOGTAIL_H #define LOGTAIL_H #include <QProcess> #include <QDebug> 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"<<fn; // 启动 tail -f start("tail",argv); } ~LogTail(){ terminate(); } signals: void logString(const QString& line); public slots: void logoutput(){ QByteArray output = readAllStandardOutput(); qDebug()<<"output:"<<output; QStringList lines = QString(output).split("\n"); foreach (QString line, lines) { emit logString(line); } } }; #endif // LOGTAIL_H ``` </details> <details> <summary> main.cpp</summary> ``` #include <QApplication> #include <QTextEdit> #include <QDebug> #include <QFile> #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 "<<filename; } QFile file(a.applicationDirPath()+"/"+filename,qApp); // 调用进程 LogTail tail(filename); tail.connect(&tail,&LogTail::logString,&textEdit,&QTextEdit::append); textEdit.show(); return a.exec(); } ``` </details> <br /> ### 给进程设置环境变量 环境变量和它们的值通常由父进程设置 ``` QProcess process; QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); env.insert("TMPDIR", "C:\\MyApp\\temp"); // Add an environment variable process.setProcessEnvironment(env); process.start("myapp"); ```