Qt QProcess调用外部程序,并实时打印输出信息

2024-05-31 13:52

本文主要是介绍Qt QProcess调用外部程序,并实时打印输出信息,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Qt QProcess调用外部程序,并实时打印输出信息

  • 引言
  • 一、源码分析
    • 1. 外部程序 - 被QProcess调用启动
    • 2. QProcessDemo - 调用外部程序,并实时打印输出信息
  • 二、参考链接

引言

在这里插入图片描述

QProcess是Qt框架中的一个类,用于处理外部进程。它提供了一种直接与操作系统的进程进行交互的方式,可以启动一个外部程序,与其进行通信,获取其输出和错误信息,以及控制其运行。

  • 本文写了一个QProcess的试例,调用一个程序并实时获取其打印的信息.

一、源码分析

1. 外部程序 - 被QProcess调用启动

写了一个专用于打印的AlwaysOut程序. 方便QProcess获取 使用了多种输出方式,包括但不限于coutqDebugOutputDebugStringA等。

  • 只有coutfprintf会输出到标准流? 只有这俩的输出可被QProcess获取
  • qDebug 等Qt输出的函数输出的内容无法被QProcess获取…怀疑没有输出,但是双击exe会输出的小黑框里

可参考 qDebug()、printf()、fprintf(stdout)等输出接口研究:https://blog.csdn.net/qq_22300209/article/details/135628264

#include <QCoreApplication>
#include <QThread>
#include <QDebug>
#include <iostream>
#include <string>
#include "windows.h"
using namespace std;int main()
{for (int i=0;i<3;i++){cout<<i<<": "<<endl;qDebug()<<"qDebug";qWarning()<<"qWarning";fprintf(stdout,"fprintf\n");fflush(stdout);OutputDebugStringA("Hello, Debugger!\n");cout<<"结束"<<endl;qDebug()<<"结束";Sleep(3000);}return 0;
}

Qt项目 run中勾选run in 终端的话,OutputDebugStringA会输出到应用程序输出界面,其他则会输出到弹出的小黑框中. 回想起了以下问题:
Qt Debug模式下应用程序输出界面乱码【已解决】:https://blog.csdn.net/qq_38204686/article/details/137793476
“应用程序输出界面“和“终端“不一样. 如何设置应用程序输出界面的编码?找不到可以设置的地方

2. QProcessDemo - 调用外部程序,并实时打印输出信息

  • 记得设定通道setProcessChannelMode(QProcess::MergedChannels),但亲测使用默认值也能获取cout的输出
  • 绑定QProcess::readyRead实时信号,使用m_process.readAll()获取实时数据
  • 增加了m_process.waitForStarted判断程序是否正常启动,使用QProcess::Running判断避免重复启动
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QDebug>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);m_process.setProcessChannelMode(QProcess::MergedChannels);   // 程序输出统一合并到标准输出通道connect(&m_process, &QProcess::readyRead, this, [&]{QString tmp = m_process.readAll();qDebug() << tmp;ui->textEdit->append(tmp);});
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{if(m_process.state() == QProcess::Running){
//        m_process.kill();
//        m_process.waitForFinished();
//        qDebug() << "kill";QMessageBox::warning(this,tr("Warning"),"process is running");return;}m_process.start("AlwaysOut.exe");
if (!m_process.waitForStarted()) {ui->textEdit->setText(m_process.errorString());} else {ui->textEdit->setText("start success!");}
}

二、参考链接

Qt调用外部exe并同步显示输出:https://blog.csdn.net/u012348774/article/details/50480379
QT QProcess调用py文件,使用readyReadStandardOutput()无法获得信号的解决办法:https://blog.csdn.net/qq_38340516/article/details/100016557
Qt5 解决 Windows 下 QProcess 无法接收到 readyRead() 信号的问题:https://blog.csdn.net/qq_47544847/article/details/131510323
qDebug输出换行的原因:https://www.cnblogs.com/nuoforever/p/15513784.html
顺序设备 - QProcess 类(启动进程,与之交互):https://zhuanlan.zhihu.com/p/52116398
Qt-QProcess无法读取进程输出以及CreateNamedPipe failed(拒绝访问)问题解决:https://blog.csdn.net/mrbone11/article/details/125736249

这篇关于Qt QProcess调用外部程序,并实时打印输出信息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1018111

相关文章

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

python如何调用java的jar包

《python如何调用java的jar包》这篇文章主要为大家详细介绍了python如何调用java的jar包,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录一、安装包二、使用步骤三、代码演示四、自己写一个jar包五、打包步骤六、方法补充一、安装包pip3 install

Qt如何实现文本编辑器光标高亮技术

《Qt如何实现文本编辑器光标高亮技术》这篇文章主要为大家详细介绍了Qt如何实现文本编辑器光标高亮技术,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录实现代码函数作用概述代码详解 + 注释使用 QTextEdit 的高亮技术(重点)总结用到的关键技术点应用场景举例示例优化建议

Qt 设置软件版本信息的实现

《Qt设置软件版本信息的实现》本文介绍了Qt项目中设置版本信息的三种常用方法,包括.pro文件和version.rc配置、CMakeLists.txt与version.h.in结合,具有一定的参考... 目录在运行程序期间设置版本信息可以参考VS在 QT 中设置软件版本信息的几种方法方法一:通过 .pro

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET