哪里可以找到免费的网站,海南疾控发布问卷调查,wordpress 必须登录,青岛制作公司网站我们常常想通过某一个类#xff0c;来启动一个外部进程 本文将讲解如何通过QProcess来进行启动外部进程
一#xff1a;了解QProcess QProcess是Qt框架提供的一个类#xff0c;用于在应用程序中执行外部进程。它提供了一系列函数来启动、控制和与外部进程进行交互 1.启动进程… 我们常常想通过某一个类来启动一个外部进程 本文将讲解如何通过QProcess来进行启动外部进程
一了解QProcess QProcess是Qt框架提供的一个类用于在应用程序中执行外部进程。它提供了一系列函数来启动、控制和与外部进程进行交互 1.启动进程的方式 (1.1)分离式:外部程序启动程序后主程序退出时被调用的进程继续执行不退出
[static] bool QProcess::startDetached(const QString program, const QStringList arguments, const QString workingDirectory QString(), qint64 *pid nullptr)(1.2)一体式当主程序退出时,被主程序调用起来的进程也退出
start还有其他的重载的函数下面是其中一个
void QProcess::start(const QString program, const QStringList arguments, QIODevice::OpenMode mode ReadWrite)2常用的阻塞函数
// 主进程阻塞直到外部程序启动完毕,
waitForStarted()// 主进程阻塞直到外部程序执行完毕
waitForFinished() 3:被调用进程接受数据 4:主进程接受被调用进程的数据 (4.1)使用QFile输出内容被 主进程捕获
QFile file;
file.open(1, QFile::WriteOnly);
file.write(finished);
file.close();(4.2)使用输出流 被 主进程捕获 cout its message endl;5常用的信号
//启动完毕
connect(process, QProcess::started, this, []()
{});//捕获到消息时
connect(process, QProcess::readyReadStandardOutput, this, []()
{});//完成
connect(process, QOverloadint, QProcess::ExitStatus::of(QProcess::finished), this, [](int exitCode, QProcess::ExitStatus exitStatus)
{});//状态改变
connect(process, QProcess::stateChanged, this, [](QProcess::ProcessState state)
{});二使用QPrecess
1startDetached 启动进程 1使用了startDetached来启动进程信号都是无效的接受不到任何消息 2当主进程关闭时被调用的QTcpClientTest.exe 是不会退出的 3主进程发送的参数被调用的QTcpClientTest.exe 依然可以接受 void QTcpSeverTest::on_btn1_clicked()
{QProcess* process new QProcess(this);QString str QApplication::applicationDirPath() /QTcpClientTest.exe;QStringList list;list.append(123);list.append(456);//分离式 启动外部进程process-startDetached(str, list);//无效connect(process, QProcess::started, this, [](){qDebug() started;});//无效connect(process, QProcess::readyReadStandardOutput, this, [](){QString qstr(process-readAllStandardOutput());qDebug() startDetached: qstr;});connect(process, QOverloadint, QProcess::ExitStatus::of(QProcess::finished), this, [](int exitCode, QProcess::ExitStatus exitStatus){QString result process-readAll();qDebug() result: result;});//无效connect(process, QProcess::stateChanged, this, [](QProcess::ProcessState state){qDebug() show state:;switch (state){case QProcess::NotRunning:qDebug() Not Running;break;case QProcess::Starting:qDebug() Starting;break;case QProcess::Running:qDebug() Running;break;default:qDebug() otherState;break;}});}2start启动进程 1使用了startDetached来启动进程信号都是可以接受的 2当主进程关闭时被调用的QTcpClientTest.exe 是随着主进程一起退出 3主进程发送的参数被调用的QTcpClientTest.exe 可以接受参数 QProcess* process new QProcess(this);QString str QApplication::applicationDirPath() /QTcpClientTest.exe;QStringList list;list.append(bbbbb);list.append(aaaaa);//启动完毕connect(process, QProcess::started, this, [](){qDebug() started: ;});//捕获到消息时connect(process, QProcess::readyReadStandardOutput, this, [](){QString qstr(process-readAllStandardOutput());qDebug() readyReadStandardOutput: qstr;});//完成connect(process, QOverloadint, QProcess::ExitStatus::of(QProcess::finished), this, [](int exitCode, QProcess::ExitStatus exitStatus){if (exitStatus QProcess::NormalExit) {qDebug() Process finished with exit code: exitCode;}else {qDebug() Process crashed!;}});//状态改变connect(process, QProcess::stateChanged, this, [](QProcess::ProcessState state){qDebug() show state:;switch (state){case QProcess::NotRunning:qDebug() Not Running;break;case QProcess::Starting:qDebug() Starting;break;case QProcess::Running:qDebug() Running;break;default:qDebug() otherState;break;}});//一体式 启动外部进程process-start(str, list);3execute()启动进程 1使用了execute来启动进程信号是无效的 2主进程一直处于阻塞状态等待被调用的QTcpClientTest.exe完成(关闭软件) QProcess* process new QProcess(this);QString str QApplication::applicationDirPath() /QTcpClientTest.exe;QStringList list;list.append(bbbbb);list.append(aaaaa);//无效connect(process, QProcess::started, this, [](){qDebug() started:;});//无效connect(process, QProcess::readyReadStandardOutput, this, [](){QString qstr(process-readAllStandardOutput());qDebug() readyReadStandardOutput: qstr;});//无效connect(process, QOverloadint, QProcess::ExitStatus::of(QProcess::finished), this, [](int exitCode, QProcess::ExitStatus exitStatus){QString result process-readAll();qDebug() result: result;});//无效connect(process, QProcess::stateChanged, this, [](QProcess::ProcessState state){qDebug() show state:;switch (state){case QProcess::NotRunning:qDebug() Not Running;break;case QProcess::Starting:qDebug() Starting;break;case QProcess::Running:qDebug() Running;break;default:qDebug() otherState;break;}});//如果进程 QTcpClientTest 不关闭 或者完成 则此进程一直卡住int exitCode QProcess::execute(str, list);if (exitCode ! 0) {qDebug() 外部程序执行失败;}//接受进程捕获到输出的消息QByteArray output process-readAllStandardOutput();QString msg QString::fromLocal8Bit(output);qDebug() msg;打印的信息为QIODevice::read (QProcess): device not open说明execute没有打开设备接受不到消息
4start() waitForFinished()启动进程 1使用了execute来启动进程信号是无效的 2主进程一直处于阻塞状态等待被调用的QTcpClientTest.exe完成(关闭软件) QProcess* process new QProcess(this);QString str QApplication::applicationDirPath() /QTcpClientTest.exe;QStringList list;list.append(bbbbb);list.append(aaaaa);//启动进程process-start(str,list);// 等待进程完成process-waitForFinished();//接受进程捕获到输出的消息QByteArray output process-readAllStandardOutput();QString msg QString::fromLocal8Bit(output);qDebug() msg;完整代码: QProcess完整学习代码
参考博客 QProcess使用 一 QProcess使用 二 QProcess使用 三 QProcess使用 四