QT笔记 - QProcess读取外部程序(进程)消息

简要介绍

QProcess 可用于在当前程序中启动独立的外部程序(进程),并进行通讯,通讯原理是通过程序的输入或输出流,即通过c中的printf()和或c++的std::cout等。

函数

  1. void QProcess**::start**(const QString & program, const QStringList & arguments = {}, OpenMode mode = ReadWrite)
  2. void QProcess**::** readyReadStandardOutput()
  3. QByteArray QProcess**::readAllStandardOutput** ()
  4. bool QProcess**::waitForFinished** (int msecs = 30000)

函数说明

  1. 启动目标程序。形参: program:目标程序启动目录,包含程序名称及后缀;arguments:参数,可以向目标程序的main()函数传递两个参数;mode:读写打开模式。
  2. 是个信号函数,目标程序有即时输出时触发,可用于接收目标程序的实时输出
  3. 读取输出
  4. 等待目标程序完成(退出) ,注意期间主程序会陷入冻结状态。形参:msec:等待时长,注意,该时间到期后将主动关闭目标程序,默认30000毫秒,-1时可无限时长等待。

示例

主程序:

cpp 复制代码
    QProcess process;
    // process.setProcessChannelMode(QProcess::MergedChannels);
    process.start("C:\\myapp\\ProcessTest.exe");

    // 实时读取
    process.connect(&process, &QProcess::readyReadStandardOutput, [&](){
        qDebug() << "main - " << process.readAllStandardOutput();
    });

    if(process.waitForFinished(-1)){
        qDebug() << "main - Process:\"" << process.program() << "\" Finished";
    }


    // // 或目标程序退出后读取全部
    // if(process.waitForFinished(-1)){
    //     qDebug() << "main - " << process.readAllStandardOutput();
    // } else {
    //     qDebug() << "main - 2";
    // }

目标程序:

复制代码
void Widget::on_pushButton_clicked()
{
    std::cout << "Widget::on_pushButton_clicked - " << ui->lineEdit->text().toStdString() << std::endl;
    std::cout << std::flush;
}

测试结果输出:

相关推荐
wdfk_prog4 小时前
嵌入式面试真题第 10 题:高优化等级下共享状态可见性、内存模型与系统级同步设计
java·linux·开发语言·面试·职场和发展·架构·c
闻道且行之6 小时前
TurboOCR:基于PP-OCRv6的极速Windows离线OCR工具,深度解析3.4GB依赖背后的技术架构
c++·人工智能·python·qt·机器学习·ocr
许彰午7 小时前
95_Python内存管理与垃圾回收
开发语言·python
多加点辣也没关系7 小时前
JavaScript|第13章:原始类型的方法
开发语言·javascript·ecmascript
এ慕ོ冬℘゜7 小时前
深入理解 JavaScript 事件体系:Window、鼠标与键盘事件详解
开发语言·javascript·okhttp
chouchuang9 小时前
day-030-综合练习-笔记管理器
开发语言·笔记·python
云空10 小时前
《Three.js 3D实例大全》
开发语言·javascript·3d·three.js
techdashen10 小时前
Go 1.26 新增 `bytes.Buffer.Peek`:只看数据,不移动读取位置
开发语言·后端·golang
C137的本贾尼10 小时前
第七篇:消息队列(MQ)——就是个带存储的异步通信管道
java·开发语言·中间件
从零开始的代码生活_11 小时前
C++ list 原理与实践:双向链表、迭代器与简化实现
开发语言·c++·后端·学习·算法·链表·list