QT QProcess的使用

news2024/12/24 20:44:07

定义

The QProcess class is used to start external programs and to communicate with them.

QProcess类是用来启动一个外部程序并与之通信。

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(Qt实战项目视频教程+代码,C++语言基础,C++设计模式,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

使用说明

开启外部线程的3中方式

想要启动一个进程,可以传递你想启动的程序的名字和命令行参数作为参数传递给start()函数。参数作为QStringList中每一个单独的字符串。

或者,你可以通过setProgram()和setArguments()来设置该程序,然后调用start()或者open()启动该程序。

启动时在指定程序名时就附带上参数

QProcess process;
process.start("cmd /c ping 127.0.0.1");

启动时分别指定函数名和参数列表

QProcess process;
process.start("cmd", QStringList()<<"/c"<<"ping 127.0.0.1", QIODevice::ReadWrite);

分别指定函数名和参数,然后再启动

QProcess process;
process.setProgram("cmd");
process.setArguments(QStringList()<<"/c"<<"ping 127.0.0.1");
process.start(QIODevice::ReadWrite);

一次性读取进程输出

void readProcessAllOnce(bool processAutoExit) {
    qDebug()<<"readProcessAllOnce, processAutoExit ="<<processAutoExit;
    qDebug()<<"----------------------";
    bool ret;
    QProcess process;
    QString command;
    if(processAutoExit) {
        command = "cmd /c ping 127.0.0.1";
    } else {
        command = "cmd /k ping 127.0.0.1";
    }
    process.start(command);
    /*
     * bool QProcess::waitForStarted(int msecs = 30000)
     */
    ret = process.waitForStarted();
    qDebug()<<"waitForStarted"<<ret;
    qDebug()<<QDateTime::currentDateTime();
    /*
     * 如果打开的不是自动关闭的进程,那么这里最多可能会等待30秒
     * bool QProcess::waitForFinished(int msecs = 30000)
     */
    ret = process.waitForFinished();
    qDebug()<<QDateTime::currentDateTime();
    qDebug()<<"waitForFinished"<<ret;
    QByteArray byteArray = process.readAllStandardOutput();
    QString str = QString::fromLocal8Bit(byteArray);
    qDebug()<<str;
    process.close();
    qDebug()<<"";
    qDebug()<<"======================";
}

按行读取进程输出

void readProcessByLine() {
    qDebug()<<"readProcessByLine";
    qDebug()<<"----------------------";
    bool ret;
    QProcess process(0);
    /*
     * cmd /c 的命令执行完后会关闭窗口
     * cmd /k 的命令执行完后不会关闭窗口
     *
     * aa && bb 就是执行aa,成功后再执行bb
     * aa || bb 先执行aa,若执行成功则不再执行bb,若失败则执行bb
     * a  &  b  表示执行a再执行b,而无论a是否成功
     */
    process.start("cmd", QStringList()<<"/k"<<"ping 127.0.0.1"<<"&"<<"exit", QIODevice::ReadWrite);
//    process.setProgram("cmd");
//    process.setArguments(QStringList()<<"/k"<<"ping 127.0.0.1"<<"&"<<"exit");
//    process.start(QIODevice::ReadWrite);
    ret = process.waitForStarted();
    qDebug()<<"waitForStarted"<<ret;
    qint64 maxSize = 512;
    char buffer[maxSize];
    qint64 len;
    while(true) {
        /*
         * 一个waitForReadyRead信号可能输出的是多行
         */
        ret = process.waitForReadyRead();
        qDebug()<<"waitForReadyRead"<<ret;
        if(!ret) {
            break;
        }
        while(true) {
            len = process.readLine(buffer, maxSize);
            qDebug()<<"buffer len"<<len;
            /*
             * 因为每一行至少还有回车换行符,因此读到0,说明waitForReadyRead超时返回false
             */
            if(len <= 0) {
                break;
            }
            QString str = QString::fromLocal8Bit(buffer);
            qDebug()<<"qstring len"<<str.length();
            qDebug()<<str;
            qDebug()<<"";
        }
    }
    process.write("exit\r\n");
    ret = process.waitForFinished();
    qDebug()<<"waitForFinished"<<ret;
    process.close();
    qDebug()<<"";
    qDebug()<<"======================";
}

与进程交互

void openProcessThenWrite() {
    qDebug()<<"openProcessThenWrite";
    qDebug()<<"----------------------";
    bool ret;
    QProcess *process = new QProcess(QThread::currentThread());
    /*
     * 如果没有QCoreApplication的话,会报如下错误
     * QObject::startTimer: Timers can only be used with threads started with QThread. timer只能在同一个线程中创建和启动.
     */
    process->start("cmd", QIODevice::ReadWrite);
    ret = process->waitForStarted();
    qDebug()<<"waitForReadyRead"<<ret;
    QByteArray byteArray = process->readAllStandardOutput();
    QString str = QString::fromLocal8Bit(byteArray);
    qDebug()<<str;
    //这里不加换行的话命令发不出去
    qint64 len = process->write("ping 127.0.0.1\r\nexit\r\n");
    qDebug()<<"write len"<<len;
    while(true) {
        /*
         * 如果进程已经关闭,waitForReadyRead会直接返回false
         */
        ret = process->waitForReadyRead();
        qDebug()<<"waitForReadyRead"<<ret;
        if(!ret) {
            break;
        }
        byteArray = process->readAllStandardOutput();
        str = QString::fromLocal8Bit(byteArray);
        qDebug()<<str;
        qDebug()<<"";
    }
    /*
     * 如果没有关闭cmd的指令,因此该process永远不会finished,会超时(30秒)返回false
     */
    ret = process->waitForFinished();
    qDebug()<<"waitForFinished"<<ret;
    process->close();
    delete process;
    qDebug()<<"";
    qDebug()<<"======================";
}

测试函数

#include <QCoreApplication>
#include <QDebug>
#include <QProcess>
#include <QThread>
#include <QDateTime>

void readProcessAllOnce(bool processAutoExit) {
    ……
}

void readProcessByLine() {
    ……
}

void openProcessThenWrite() {
    ……
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug()<<"======================";
    readProcessAllOnce(false);
    readProcessAllOnce(true);
    readProcessByLine();
    openProcessThenWrite();

    qDebug()<<"That's all";
    return a.exec();
}

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(Qt实战项目视频教程+代码,C++语言基础,C++设计模式,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1136272.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL初始化之后启动报错(mysqld: Table ‘mysql.plugin‘ doesn‘t exist)

报错场景 初始化之后&#xff0c;服务无法启动。错误日志error-log 报错如下&#xff1a;&#xff08;mysql库下的系统表不存在&#xff09; 2023-10-26T06:03:08.150163-00:00 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. 2023-10-26T06:03:08.496…

RabbitMQ生产者的可靠性

目录 MQ使用时会出现的问题 生产者的可靠性 1、生产者重连 2、生产者确认 3、数据持久化 交换机持久化 队列持久化 消息持久化 LazyQueue懒加载 MQ使用时会出现的问题 发送消息时丢失&#xff1a; 生产者发送消息时连接MQ失败生产者发送消息到达MQ后未找到Exchange生产…

linux音频-IIS音频接口

IIS 总线 IIS(Integrate Interface of Sound)即集成音频接口&#xff0c;在上个世纪 80 年代首先被 Philips 公司用于消费产品的音频设备&#xff0c; I2S规范 I2S总线只能用来处理audio data&#xff0c;而别的信号比如控制信号&#xff0c;编码信号则交给别的模块处理。为了…

The Gradle daemon may be trying to use ipv4 instead of ipv6.

重新配置了jdk和gradle&#xff0c;导致新创建的项目都会报该错误。以下是解决办法。 mac的环境 一 改项目JDK的位置 如果一没有解决接着配置 vim ~/.bash_profile 新增 export _JAVA_OPTIONS“-Djava.net.preferIPv4Stacktrue” 参考&#xff1a; https://sites.google.com…

618京东到家APP-门详页反爬实战

一、背景与系统安全需求分析 1. 系统的重要性 上图所示是接口所属位置、对电商平台或在线商店而言,分类查商品都是很重要的,通过为用户提供清晰的商品分类,帮助他们快速找到所需产品,节省浏览时间,提升购物效率,是购物结算产生GMV的核心环节。那么电商平台为什么都很看重…

Creaform形创HandySCAN MAX三维扫描仪大型零部件尺寸测量设备

CASAIM中科院广州电子智能制造事业部连续多年荣获形创Creaform战略级代理商证书。战略级代理商是形创Creaform最高级别的合作伙伴。 2023年CASAIM中科院广州电子智能制造事业部的形创Creaform战略级代理商证书&#xff1a; Creaform 形创是便携式三维测量解决方案和工程服务领…

“摸不着”的数字孪生,如何带来“看得见”的数据效益?

目录 数字孪生的6问6答 01 何为数字孪生&#xff1f; 02 数字孪生的地位与趋势如何&#xff1f; 03 哪些行业在关注和应用数字孪生&#xff1f; 04 数字孪生的应用场景有哪些&#xff1f; 05 数字孪生与智能制造的关系&#xff1f; 06 如何利用数字孪生 第一步&#xf…

QuestPass来袭,500万SUI奖池拉满并降低获奖难度!

自上周Quest 3规调整后&#xff0c;社区的担忧和反馈减少&#xff0c;但是我们仍然看到一些用户在达到资格以及争取奖励方面遇到困难。感谢你们抽出时间与我们反馈这些问题&#xff0c;下面将与你们分享在Quest 3中最新调整的规则信息&#xff1a; 新增QuestPass 为了使任何人…

C语言系统化精讲(五):C语言格式化输入和运算符与表达式

文章目录 一、C语言格式化输入1.1 C语言scanf&#xff1a;读取从键盘输入的数据&#xff08;含输入格式汇总表&#xff09;1.2 C语言输入字符和字符串&#xff08;所有函数大汇总&#xff09;1.2.1 输入单个字符1.2.2 输入字符串 二、运算符与表达式2.1 运算符与表达式2.1.1 运…

我用好说 AI 画出了漫画故事

现在的 AI 有多神奇&#xff1f;我已经可以用它来 “想故事、写分镜、画漫画” 了。 这里就来秀秀用 好说 AI 做出来的一些漫画&#xff1a; 大家多少都遇到过&#xff1a;曾经有个不错的想法&#xff0c;可能只是 “一个场景”、“一句话”&#xff0c;但真的就一闪而过&…

《算法通关村——黄金挑战数组问题》

《算法通关村——黄金挑战数组问题》 数组中出现次数超过一半的数字 描述 数组中有一个数字出现的次数超过数组长度的一半&#xff0c;请找出这个数字。 例如&#xff1a;输入如下所示的一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次&#xff0c;超过数…

软件测试面试1000问(含答案+文档)

Part1 1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自…

Python基础教程:关于序列操作的方式方法

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 序列是指按照位置顺序来存储数据的数据结构&#xff0c;也就是说能通过数值索引进行操作。 实际上&#xff0c;python对序列的解释是&#xff1a;只要类型对象中…

C语言系统化精讲(七):C语言数组详解

文章目录 一、数组的基本概念二、一维数组2.1 一维数组的定义2.2 一维数组初始化2.3 一维数组的引用 三、二维数组3.1 二维数组的定义3.2 二维数组初始化3.3 二维数组的引用 四、C语言数组是静态的&#xff0c;不能插入或删除元素五、C语言数组的越界和溢出5.1 数组越界5.2 数组…

C++基础:函数模板

为了代码重用&#xff0c;代码必须是通用的&#xff1b;通用的代码就必须不受数据类型的限制。那么我们可以把数据类型改为一个设计参数&#xff0c;这种类型的程序设计称为参数化程序设计&#xff0c;软件模板有模板构造&#xff0c;包括函数模板和类模板。 函数模板可以用来…

分享一下怎么做一个签到积分的微信小程序

在微信小程序中&#xff0c;签到积分功能是一种非常实用的功能&#xff0c;它可以帮助企业吸引用户&#xff0c;增加用户的忠诚度和活跃度。下面将介绍如何设计和实现一个签到积分的微信小程序。 一、设计页面 签到积分微信小程序的页面设计应该简洁明了&#xff0c;操作简单。…

error: the following arguments are required: --model, --data 解决方法

错误原因&#xff1a;Windows下需要缺乏配置参数&#xff0c;需要进行相关参数配置。 解决办法&#xff1a;在Pycharm的编辑设置&#xff0c;加上–model--model ****,其中****为指定的模型名称&#xff0c;按照自己实际报错进行添加&#xff0c;比如我这里要跑的模型为bert&am…

如何让元素在页面中完美居中?看这篇文章就够了!

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一…

Python爬虫防止被封的方法:动态代理ip

目录 前言 一、为什么需要使用动态IP代理 1.网站反爬虫机制 2.突破本地IP限制 3.获取更多数据 二、Python爬虫动态IP代理的实现方法 1.使用第三方库 2.使用爬虫框架 三、预防被封的方法 1.代理池管理 2.请求间隔设置 3.使用多个代理 总结 前言 在进行网站爬取时&…

四周年,创始人李亚飞写给 ShowMeBug 用户的一封信

见信如晤。 此刻&#xff0c;我心怀感激&#xff0c;感谢您对 ShowMeBug 的支持和鼓励。ShowMeBug 在这几年能够在剧烈竞争的环境中存活下来&#xff0c;证明了大家对我们的认可&#xff0c;在此由衷感谢大家。 今天我怀着前所未有的满足感&#xff0c;想分享下 ShowMeBug 成…