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

相关文章

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

C#实现获取电脑中的端口号和硬件信息

《C#实现获取电脑中的端口号和硬件信息》这篇文章主要为大家详细介绍了C#实现获取电脑中的端口号和硬件信息的相关方法,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 我们经常在使用一个串口软件的时候,发现软件中的端口号并不是普通的COM1,而是带有硬件信息的。那么如果我们使用C#编写软件时候,如

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出

Idea调用WebService的关键步骤和注意事项

《Idea调用WebService的关键步骤和注意事项》:本文主要介绍如何在Idea中调用WebService,包括理解WebService的基本概念、获取WSDL文件、阅读和理解WSDL文件、选... 目录前言一、理解WebService的基本概念二、获取WSDL文件三、阅读和理解WSDL文件四、选择对接

基于Qt Qml实现时间轴组件

《基于QtQml实现时间轴组件》时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件,本文主要为大家详细介绍了如何使用Qml实现一个简单的时间轴组件,需要的可以参考下... 目录写在前面效果图组件概述实现细节1. 组件结构2. 属性定义3. 数据模型4. 事件项的添加和排序5. 事件项的渲染如何使用

C#读取本地网络配置信息全攻略分享

《C#读取本地网络配置信息全攻略分享》在当今数字化时代,网络已深度融入我们生活与工作的方方面面,对于软件开发而言,掌握本地计算机的网络配置信息显得尤为关键,而在C#编程的世界里,我们又该如何巧妙地读取... 目录一、引言二、C# 读取本地网络配置信息的基础准备2.1 引入关键命名空间2.2 理解核心类与方法

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

java如何调用kettle设置变量和参数

《java如何调用kettle设置变量和参数》文章简要介绍了如何在Java中调用Kettle,并重点讨论了变量和参数的区别,以及在Java代码中如何正确设置和使用这些变量,避免覆盖Kettle中已设置... 目录Java调用kettle设置变量和参数java代码中变量会覆盖kettle里面设置的变量总结ja