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开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

【北交大信息所AI-Max2】使用方法

BJTU信息所集群AI_MAX2使用方法 使用的前提是预约到相应的算力卡,拥有登录权限的账号密码,一般为导师组共用一个。 有浏览器、ssh工具就可以。 1.新建集群Terminal 浏览器登陆10.126.62.75 (如果是1集群把75改成66) 交互式开发 执行器选Terminal 密码随便设一个(需记住) 工作空间:私有数据、全部文件 加速器选GeForce_RTX_2080_Ti

EMLOG程序单页友链和标签增加美化

单页友联效果图: 标签页面效果图: 源码介绍 EMLOG单页友情链接和TAG标签,友链单页文件代码main{width: 58%;是设置宽度 自己把设置成与您的网站宽度一样,如果自适应就填写100%,TAG文件不用修改 安装方法:把Links.php和tag.php上传到网站根目录即可,访问 域名/Links.php、域名/tag.php 所有模板适用,代码就不粘贴出来,已经打

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中,不同电脑的配置和操作系统(如Win11与Win7)可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行,需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下,使LabVIEW开发的程序保持稳定运行的有效策略。 LabVIEW版本兼容性 LabVIEW各版本对不同操作系统的支持存在差异。因此,在开发程序时,尽量使用

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

这些心智程序你安装了吗?

原文题目:《为什么聪明人也会做蠢事(四)》 心智程序 大脑有两个特征导致人类不够理性,一个是处理信息方面的缺陷,一个是心智程序出了问题。前者可以称为“认知吝啬鬼”,前几篇文章已经讨论了。本期主要讲心智程序这个方面。 心智程序这一概念由哈佛大学认知科学家大卫•帕金斯提出,指个体可以从记忆中提取出的规则、知识、程序和策略,以辅助我们决策判断和解决问题。如果把人脑比喻成计算机,那心智程序就是人脑的