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

相关推荐

  1. el-dialog 实现可以拖动

    2023-12-23 09:06:01       27 阅读
  2. QT实现windows下获取CPU、内存磁盘信息

    2023-12-23 09:06:01       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-23 09:06:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-23 09:06:01       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-23 09:06:01       87 阅读
  4. Python语言-面向对象

    2023-12-23 09:06:01       96 阅读

热门阅读

  1. mybatisPlus 常见用法

    2023-12-23 09:06:01       46 阅读
  2. 【小白专用】HTML相对路径表示方法

    2023-12-23 09:06:01       49 阅读
  3. FeignClient调用内部服务下载文件正确打开方式

    2023-12-23 09:06:01       76 阅读
  4. 鸿蒙 - arkTs: 页面路由

    2023-12-23 09:06:01       57 阅读
  5. html实现网页添加自定义水印内容

    2023-12-23 09:06:01       69 阅读
  6. React 状态管理 - 优化你的应用程序

    2023-12-23 09:06:01       61 阅读
  7. 结构体\年月日

    2023-12-23 09:06:01       57 阅读
  8. Linux下 自定义多线程并发快速压缩解压缩脚本

    2023-12-23 09:06:01       48 阅读
  9. ChatGPT真的不火了吗?

    2023-12-23 09:06:01       71 阅读