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());

参考链接:

相关推荐
cch891816 分钟前
汇编与Java:底层与高层的编程对决
java·开发语言·汇编
荒川之神1 小时前
拉链表概念与基本设计
java·开发语言·数据库
chushiyunen1 小时前
python中的@Property和@Setter
java·开发语言·python
小樱花的樱花2 小时前
C++ new和delete用法详解
linux·开发语言·c++
froginwe112 小时前
C 运算符
开发语言
fengfuyao9852 小时前
低数据极限下模型预测控制的非线性动力学的稀疏识别 MATLAB实现
开发语言·matlab
摇滚侠2 小时前
搭建前端开发环境 安装 nodejs 设置淘宝镜像 最简化最标准版本 不使用 NVM NVM 高版本无法安装低版本 nodejs
java·开发语言·node.js
t198751282 小时前
MATLAB十字路口车辆通行情况模拟系统
开发语言·matlab
yyk的萌3 小时前
AI 应用开发工程师基础学习计划
开发语言·python·学习·ai·lua
Amumu121384 小时前
Js:正则表达式(一)
开发语言·javascript·正则表达式