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

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

1. QT调用外部exe

使用QT中的QProcess方法

cpp 复制代码
#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方法默认是无弹窗的,要想弹窗,需做如下设置:

cpp 复制代码
    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()方法实现,案例如下:

cpp 复制代码
#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());

参考链接:

相关推荐
kaixin_learn_qt_ing21 分钟前
【银河麒麟下】 安装达梦数据库 + 使用Qt访问达梦数据库
qt
mengzhi啊25 分钟前
缓存类CacheDataManager把临时数据存入json。做成插件·
qt·缓存·json
matlab代码38 分钟前
基于matlab数字图像处理的指纹识别系统【源码68期】
开发语言·matlab
matlab代码1 小时前
基于matlab的水果识别系统(苹果香蕉菠萝梨桃子)【源码65期】
开发语言·matlab
wuyk5551 小时前
从零吃透 MQTT 通信|第 8 章 FreeRTOS 多任务架构下 MQTT 工程架构,任务拆分、队列解耦、临界区保护
c语言·开发语言·stm32·学习·架构
weixin199701080161 小时前
[特殊字符]《跨境二手ERP对接Back Market:标准化API + 7~10工作日技术合规审核实录》(附Python源码)
开发语言·python·pandas
尘客-追梦2 小时前
Day 01:插件化之前,先看清 ABI 这堵墙
开发语言·c++·qt
持敬chijing2 小时前
Python-数据类型-列表
开发语言·python·青少年编程
写后端的胖头鱼3 小时前
【高频面试题】Java 基础类型 + 包装类 + String 互相转换
java·开发语言
matlab代码4 小时前
基于matlab自助水果超市水果识别收费系统(GUI界面)【源码67期】
开发语言·matlab