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

相关文章

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

QT Creator配置Kit的实现示例

《QTCreator配置Kit的实现示例》本文主要介绍了使用Qt5.12.12与VS2022时,因MSVC编译器版本不匹配及WindowsSDK缺失导致配置错误的问题解决,感兴趣的可以了解一下... 目录0、背景:qt5.12.12+vs2022一、症状:二、原因:(可以跳过,直奔后面的解决方法)三、解决方

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

Java调用Python脚本实现HelloWorld的示例详解

《Java调用Python脚本实现HelloWorld的示例详解》作为程序员,我们经常会遇到需要在Java项目中调用Python脚本的场景,下面我们来看看如何从基础到进阶,一步步实现Java与Pyth... 目录一、环境准备二、基础调用:使用 Runtime.exec()2.1 实现步骤2.2 代码解析三、

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm

Python如何调用另一个类的方法和属性

《Python如何调用另一个类的方法和属性》在Python面向对象编程中,类与类之间的交互是非常常见的场景,本文将详细介绍在Python中一个类如何调用另一个类的方法和属性,大家可以根据需要进行选择... 目录一、前言二、基本调用方式通过实例化调用通过类继承调用三、高级调用方式通过组合方式调用通过类方法/静

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

Python用Flask封装API及调用详解

《Python用Flask封装API及调用详解》本文介绍Flask的优势(轻量、灵活、易扩展),对比GET/POST表单/JSON请求方式,涵盖错误处理、开发建议及生产环境部署注意事项... 目录一、Flask的优势一、基础设置二、GET请求方式服务端代码客户端调用三、POST表单方式服务端代码客户端调用四

Spring Boot项目如何使用外部application.yml配置文件启动JAR包

《SpringBoot项目如何使用外部application.yml配置文件启动JAR包》文章介绍了SpringBoot项目通过指定外部application.yml配置文件启动JAR包的方法,包括... 目录Spring Boot项目中使用外部application.yml配置文件启动JAR包一、基本原理

Qt中实现多线程导出数据功能的四种方式小结

《Qt中实现多线程导出数据功能的四种方式小结》在以往的项目开发中,在很多地方用到了多线程,本文将记录下在Qt开发中用到的多线程技术实现方法,以导出指定范围的数字到txt文件为例,展示多线程不同的实现方... 目录前言导出文件的示例工具类QThreadQObject的moveToThread方法实现多线程QC