当前位置: 首页 > news >正文

QT调用外部exe及无终端弹窗的解决方案、并实现进程输出信息获取

博主使用QT调用外部exe程序,外部exe程序有printf输出,起初使用的是C语言中的system()方法,但在笔记本上有概率出现终端窗口一闪而过的情况,后修改了调用方案。

1. QT调用外部exe

使用QT中的QProcess方法

#include <QProcess>QProcess process;
QString cmd ="../test.exe 1 2";
process.start(cmd); // 启动可执行程序
process.startDeteched(cmd);
process.execute(cmd);

注意,此处启动可执行程序的方式有3种:

  1. start:外部程序启动后,将随主程序的退出而退出
  2. startDeteched:外部程序启动后,当主程序退出时并不退出,而是继续运行。
  3. execute:带阻塞

2. 无终端弹窗的解决方案

QProcess方法默认是无弹窗的,要想弹窗,需做如下设置:

    QProcess process(this);process.setCreateProcessArgumentsModifier([](QProcess::CreateProcessArguments *args) {args->flags |= CREATE_NEW_CONSOLE;args->startupInfo->dwFlags &= ~STARTF_USESTDHANDLES;args->startupInfo->dwFlags |= STARTF_USEFILLATTRIBUTE;args->startupInfo->dwFillAttribute = BACKGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY; // 定义终端背景及字体等颜色,可不指定.});process.start("../test.exe 1 2");process.waitForStarted(); // 等待子进程执行结束process.waitForFinished();// process.close(); // 强制关闭子进程

注意,此处不能使用execute方法,否则无效。对于CREATE_NEW_CONSOLE等关键字,不是QT本身定义的内容,其被定义在Windows.h头文件中,所以需要包含该头文件。

3. 实现进程输出信息的获取

使用readAll()或者readAllStandardOutput()方法实现,案例如下:

#include <QProcess>
#include <QTextCodec>QProcess process;
process.start("../test.exe 1 2");
process.waitForFinished();
process.waitForReadyRead();
QByteArray qba  = process.readAll();QTextCodec* pTextCodec = QTextCodec::codecForName("System");
assert(pTextCodec != nullptr);
QString str = pTextCodec->toUnicode(qba);
qDebug("%s\n",str.toStdString().c_str());

参考链接:

  • https://doc.qt.io/qt-5/qprocess.html#CreateProcessArgumentModifier-typedef
  • https://cloud.tencent.com/developer/article/1932764?from_column=20075
  • https://blog.csdn.net/kangkanglhb88008/article/details/125823353
  • https://blog.csdn.net/VVBBBBB/article/details/121016042
  • https://blog.csdn.net/m0_56554817/article/details/128252004
http://www.lryc.cn/news/265909.html

相关文章:

  • 大语言模型的三种主要架构 Decoder-Only、Encoder-Only、Encoder-Decoder
  • 【MySQL】外连接 where 和 on 的区别
  • 【优化】XXLJOB修改为使用虚拟线程
  • 金蝶Apusic应用服务器 loadTree JNDI注入漏洞复现(QVD-2023-48297)
  • PromptNER: Prompt Locating and Typing for Named Entity Recognition
  • QT编写应用的界面自适应分辨率的解决方案
  • Kubernetes pod ip 暴露
  • 442. 数组中重复的数据
  • Qt/C++视频监控Onvif工具/组播搜索/显示监控画面/图片参数调节/OSD管理/祖传原创
  • word2003 open word2007+
  • windows安装、基本使用vim
  • 【SpringBoot快速入门】(1)SpringBoot的开发步骤、工程构建方法以及工程的快速启动详细讲解
  • Day69力扣打卡
  • 机器学习:手撕 AlphaGo(一)
  • ElasticSearch学习篇9_文本相似度计算方法现状以及基于改进的 Jaccard 算法代码实现
  • 大创项目推荐 深度学习+python+opencv实现动物识别 - 图像识别
  • Debezium系列之:Flink SQL消费Debezium数据格式,同步数据到下游存储系统
  • webrtc支持的最小宽度和高度
  • 虚拟机对象的创建
  • 阿里云吴结生:云计算是企业实现数智化的阶梯
  • MySQL——复合查询
  • mysql 23-3day 数据库授权(DCL)
  • OpenHarmony之内核层解析~
  • Chatgpt如何共享可以防止封号!
  • 智能优化算法应用:基于社交网络算法3D无线传感器网络(WSN)覆盖优化 - 附代码
  • thinkphp+vue+mysql酒店客房管理系统 b1g8z
  • nodejs+vue+ElementUi摄影作品图片分享工作室管理系统
  • 详解FreeRTOS:专栏总述
  • 在 linux 服务器上安装Redis数据库
  • 阿里云经济型、通用算力型、计算型、通用型、内存型云服务器最新活动报价