QProcess学习

Qt之Qprocess QProcess 可用于完成启动外部程序,并与之交互通信。 阅读详情
QProcess
Qt提供了一个QProcess类用于启动外部程序并与之通信.
    启动一个新的进程的操作非常简单,只需要将待启动的程序名称和启动参数传递给start()函数即可.
    例如:
    QObject *parent;
    QString program = "tar" 
    QStringList arguments;
    arguments << "czvf" << "backup.tar.gz" << "/home";
    QProcess *myProcess = new QProcess(parent);
    QProcess->start(program, arguments);
当调用start()函数后,myProcess进程立即进入启动状态,但tar程序尚未被调用,不能读写标准输入输出设备.
当进程完成启动后就进入"运行状态"并向外发出started()信号.在输入输出方面,QProcess将一个进程看做一
个流类型的I/O设备,可以像使用QTcpSocket读写流类型的网络连接一样来读写一个进程.可以通过QIODevice::write()
函数向所启动进程的标准输入写数据,也可以通过QIODevice::read().QIODevice::readLine()和QIODevice::getChar()
函数从这个进程的标准输出读数据.此外由于QProcess是从QIODevice类继承而来的,因四级,它也可以作为QXmlReader
的数据在源,或者为QFtp产生上传数据.最后,当进程退出时QProcess进入起始状态----"非运行状态",并发出finished()
信号.
    void finished(int exitCode, QProcess::ExitStatus exitStatus)信号在参数中返蜀犬吠日了进程退出的退出码
和退出状态,可以调用exitCode()函数和exitStatus()函数分别获取最后退出进程的这两个值.其中,Qt定义的进程"退出
状态"只有正常退出和进程崩溃两种,分别对应值QProcess::NormalExit(值0)和QProcess::CrashExit(值1).当进程在运
行中产生错误时,QProcess将发出error()信号,可以通过,调用error()函数返回最后一次产生错误的类型,并通过,state()
找出此时进程所处的状态.Qt定义了如下的进程错误代码:
----------------------------------------------------------------
错误常量                        值      描述
QProcess::FailedToStart        0       进程启动失败
QProcess::Crashed              1       进程成功启动后崩溃
QProcess::Timedout             2       最后一次调用waitFor...()函数超时.此时QProcess状态不变,并可以再次调用waitFor()类型的函数
QProcess::WriteError           3       向进程写入时出错.如进程尚未启动,或者输入通道被关闭时
QProcess::ReadError            4       从进程中读取数据时出错.如进程尚未启动时
QProcess::UnknownError         5       未知错误.这也是error()函数返回的默认值

进程的标准输出:
stdout:通常用于控制台下输出
stderr:通常用于进程打印错误
它们本质上是两个独立的数据流.
可以通过调用setReadChanned()函数设置当前的读通道
当有可读数据时Qt将发发出readyRead()信号
如果是标准输出和标准错误通道中读取数据,还会发出readyReadStandardOutput()信号
如果是标准错误也会发出readyReadStandardError()信号
readAllStandardOutput()函数从标准输出通道中读取数据
readAllStandardErrot()函数从标准错误通道中读取数据
在进程启动以前以MergedChannels参数调用setReadChannelMode()函数可以把标准输出通道和标准输错误通道合并
例:

#include <QApplication>
#include <QProcess>
#include <QString>
#include <iostream>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QProcess proc;
    QStringList arguments;
    arguments << "-na";
    proc.start("netstat", arguments);

    // 等待进程启动
    if (!proc.waitForStarted())
    {
        std::cout << "启动失败\n";
        return false;
    }
    // 关闭写通道,因为没有向进程写数据,没用到 
    proc.closeWriteChannel();

    // 用于保存进程的控制台输出
    QByteArray procOutput;
    // 等待进程结束
    while (false == proc.waitForFinished())
    {
        ;
    }
    // 读取进程输出到控制台的数据
    procOutput = proc.readAll();
    // 输出读到的数据
    std::cout << procOutput.data() << std::endl;
    // 返回
    return EXIT_SUCCESS;
}
Qt5.14.2实战:用QProcess调用Python脚本实现自动化(附完整代码) 本文详细介绍了在Qt5.14.2桌面应用中,如何利用QProcess类高效调用Python脚本实现自动化任务。通过对比QProcess与系统命令的差异,文章提供了从同步执行到异步通信的完整实战代码,涵盖路径设置、参数传递、实时输出捕获及错误处理等核心技巧,帮助开发者构建稳定、可扩展的跨语言应用。 阅读详情

相关推荐

Qt5.14.2实战:用QProcess玩转Python脚本调用与输出捕获(附完整代码)

本文详细介绍了在Qt5.14.2中使用QProcess调用Python脚本并捕获输出的实战方法。通过QProcess的进程操作功能,开发者可以实现跨语言集成,解决输出捕获、生命周期管理和数据交互等核心问题。文章包含完整代码示例,涵盖环境配置、实时输出捕获、参数传递等关键技术点,帮助开发者高效实现Qt与Python的协同工作。

garlic的博客 772

QProcess 使用过程及遇到的问题

和waitForFinished()一样,避免在主线程中使用waitForStarted(),以免造成界面无响应。最好在子线程中执行需要等待进程启动的操作,确保程序的流畅性。在这个例子中,当waitForStarted()返回true时,表示进程已成功启动;在Qt中,QProcess::waitForStarted()是一个用于等待进程启动的方法。如果想在等待过程中设置超时时间,可以使用waitForFinished(int msecs)方法,其中msecs为超时时间(以毫秒为单位)。

无涟漪77的博客 2062

Qt调用cmd

一、效果展示 二、关键代码 QProcess process; QString cmd = "ping 127.0.0.1"; process.start(cmd); process.waitForStarted(); process.waitForFinished(); text->append(QString::fromLocal8Bit(process.readAllStandardOutput())); 三、完整代码 #ifndef MAINWINDOW_H #define MAINW

贝勒里恩的博客 4757

QProcess执行linux命令行的命令(详解各种情况可能存在的问题)

QProcess执行linux命令行的命令(详解各种情况可能存在的问题)

小土同学的博客 1万+

QT中ReadyRead()信号只触发一次问题解决

1、发送端Write一次,那么接收方就会有新数据到达,ReadyRead()信号就会触发一次,这种说法是错误的。 2、发送方和接收方没有一 一对应关系,发送端Write()函数调用一次,假如这一次Write了较大数据(2M),那么接收方ReadyRead()信号往往会触发两次以上,反过来,如果发送方Write()函数被调用了两次或是以上,接收方的ReadyRead()信号也可能只调用一次。经过程...

小米的修行之路 2万+

【电机控制入门】——电机控制书籍推荐

电机控制入门书籍推荐及分享 阅读须知: 1.电机控制的入门是涉及到机械、电子与控制等复杂交叉学习,它需要持续投入时间才可以看到学习的效果,如同“一万小时定律”。俗话说,九层之台,起于垒土,因此电机控制入门没有所谓的速成培训班。相反,还需要夯实好一定的基础。为此,博主建议从基础理论抓起,故推荐相关的书籍并分享给大家。 2.学习电机贵在动手实践,无论是借助于MATLAB/Simulink仿真平台来验证理论分析,或是使用板子对所设计的控制系统进行物理实现,博主极力推荐在一定基础(看完部分以下推荐的书籍),一边动手

昔时扬尘处 3万+

QT笔记——QProcess学习

2:当主进程关闭时,被调用的QTcpClientTest.exe 是随着主进程一起退出。3:主进程发送的参数,被调用的QTcpClientTest.exe 依然可以接受。3:主进程发送的参数,被调用的QTcpClientTest.exe 可以接受参数。(1.1)分离式:外部程序启动程序后,主程序退出时,被调用的进程继续执行,不退出。1:使用了startDetached来启动进程,信号都是无效的,接受不到任何消息。2:当主进程关闭时,被调用的QTcpClientTest.exe 是不会退出的。

lion_cxq的博客 7381

攻防世界-Reverse-Game

攻防世界,game,逆向

wuh2333的博客 775

qt QProcess学习

terminate(),区别于 kill() 这种暴力的退出不同,它在退出进程的时候是有机会提示用户输入任何为保存的文件等。进程的输出通道与QProcess的读取通道相对应,⽽进程的输⼊通道与QProcess的写⼊通道相对应。这是因为我们使⽤QProcess读取的内容是进程的输出,⽽我们编写的内容则成为进程的输⼊。调⽤start()函数或open()函数启动进程。以分离的方式启动外部程序,外部程序与主程序互不干扰,外部进程的父进程是。的方式启动外部程序,外部进程与主程序互不干扰,但外部进程的父进程就是。

baidu_16370559的博客 2204

Keysight ADS新手必看:3分钟搞定TDR模拟的保姆级教程(附差分信号设置技巧)

本文为Keysight ADS新手提供TDR模拟的保姆级教程,详细介绍了从基础环境准备到差分信号设置的全流程。通过内置模板调用、待测器件连接和仿真结果解读,帮助用户快速掌握TDR模拟技术,特别包含差分信号配置技巧,提升信号完整性分析效率。

weixin_30872157的博客 195

kettle9.0+ 连接Hadoop报错

kettle bug

x²+(y-√³x²)²=1的博客 1559

Qt学习之QProcess类

Qt学习之QProcess类

m0_56626019的博客 1845

IEC 61400-1:2019 附录 C 湍流模型全面解读

IEC 61400-1:2019 附录 C 全面解读

weixin_46713695的博客 471

QProcess 学习使用

QProcess 前言:使用QProcess时候,遇到了些问题,上网搜索了后,看了下源码,就记录下。 启动方式: 一、启动外部程序的两种方式: (1)一体式:voidQProcess::start(const QString & program, const QStringList & arguments, OpenMode mode = ReadWrite) ...

RangersTank的博客 933

SAP Fiori Launchpad 概述

SAP Fiori launchpad 是托管 SAP Fiori 应用程序的 shell,并为应用程序提供导航、个性化、嵌入式支持和应用程序配置等服务。SAP Fiori Launchpad 是移动和桌面设备上 SAP Fiori 应用程序的入口点。启动板显示带有图块的主页,其中可以显示实时状态指示器,例如打开的任务数量。每个图块代表用户可以启动的业务应用程序。这包括 SAP Business Suite 事务应用程序和 SAP Smart Business 分析应用程序。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 931

planning模块(6)-参考线的平滑(二次规划)

上一篇已经介绍了采样点生成锚点数据的过程,并且将所有采样点生成的锚点数据设置到了平滑器中.接下来继续介绍使用二次规划平滑参考线的算法过程.从锚点数据中提取坐标存入raw_point2d,提取横向边界存入anchorpoints_lateralbound,将起点和终点的横向边界设置为0,防止车在起点和终点位置偏离车道中心线.

让复杂的问题变得更容易理解 787

QT学习之QProcess进程调用

项目中遇到需要调用外部程序并且需要与之通信的问题,做下记录。背景是想获取matlab的版本号,思路是想通过cmd系统调用 “matlab.exe -h”命令获取返回版本信息。

p77678的博客 1002

初探802.11协议(6)——Wi-Fi 6新特性简介

Wi-Fi 6新机制(特性)介绍

FanFF的博客 1522

2023-12-05 Qt学习总结7_ QTcpSocket QTcpServer网络库_QProcess进程类_QThread线程

前言二十 QTcpSocket QTcpServer网络库客户端代码二十一 QProcess进程类二十二 QThread线程总结要解决问题: 学习qt最核心知识, 多一个都不学.二十 QTcpSocket QTcpServer网络库服务端代码:客户端代码二十一 QProcess进程类二十二 QThread线程

老林的博客 383

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【Qt 学习之路】Qt用QProcess调用可执行程序

运⾏过程要启动进程需要将要运⾏的程序的名称和命令⾏参数作为参数传递给start()函数。设置参数的⽅式有两种:⽅式⼀,将参数保存在QStringList对象中;⽅式⼆,调⽤setProgram()函数和setArguments()函数进⾏设置。调⽤start()函数或open()函数启动进程。在程序启动后,QProcess进⼊运⾏状态并发出started()信号。当进程退出时,QProcess重新进⼊NotRunning状态(初始状态),并发出finish()信号。

沙师弟专栏 1万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

QProcess的setArguments并不能真正传递参数

使用p->setArguments(QStringList()

m0_61963858的博客 654

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

利用QProcess::finished信号(signal)来保持目标程序始终运行

https://blog.youkuaiyun.com/nirendao/article/details/52133504?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164576989216780269871379%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164576989216780269871379&bi

weixin_44999599的博客 330

开源探索:高效进程间沟通的艺术——基于QT与QProcess的双向通信实践

开源探索:高效进程间沟通的艺术——基于QT与QProcess的双向通信实践 去发现同类优质开源项目:https://gitcode.com/ 在当今快速迭代的软件开发环境中,进程间的高效沟通成为了提升应用性能的关键一环。对于广大的QT开发者而言,掌握如何利用QProcess实现进程双向通信,无疑是一项重要的技能。本文将带您深入探索一个开源项目,它专注于展示如何在QT框架下利用QProcess达到优...

gitblog_09791的博客 419

QT计算机控制进程,Qt学习之路(58): 进程间交互(QProcess.readAllStandardOutput可以读取控制台的输出)...

所谓 IO 其实不过是与其他设备之间的数据交互。在 Linux 上这个概念或许会更加清楚一些。Linux 把所有设备都看作是一种文件,因此所有的 IO 都归结到对文件的数据交互。同样,与其他进程之间也存在着数据交互,这就是进程间交互。为什么需要进程间交互呢?Qt 虽然是一个很庞大的库,但是也不能面面俱到。每个需求都提供一种解决方案是不现实的。比如操作系统提供了查看当前文件夹下所有文件的命令(Win...

weixin_39941262的博客 1169

qt 进程间切换焦点_Qt学习之路(58): 进程间交互(QProcess.readAllStandardOutput可以读取控制台的输出)...

所谓 IO 其实不过是与其他设备之间的数据交互。在 Linux 上这个概念或许会更加清楚一些。Linux 把所有设备都看作是一种文件,因此所有的 IO 都归结到对文件的数据交互。同样,与其他进程之间也存在着数据交互,这就是进程间交互。为什么需要进程间交互呢?Qt 虽然是一个很庞大的库,但是也不能面面俱到。每个需求都提供一种解决方案是不现实的。比如操作系统提供了查看当前文件夹下所有文件的命令(Win...

weixin_35998980的博客 486
上一篇: Ubuntu下Zend Studio 10.5的安装及破解
下一篇: Qt控件函数的重写
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值