Qt 进程(基本用法)

news2025/2/25 2:25:20

进程的使用情况:

  • 运行的当前的应用中调用外部程序来实现功时调使用到进程。
    • 比如:在你的运行程序中,开启迅雷或开启其他程序
  • QProcess类用来 启动一个外部程序并与之通信

QProcess类

常用一些函数:

start()开启进程,新进程中启动给定的程序,在参数中传递命令行参数
startDetached()分离式,进程不会因为主程序的关闭而关闭
close()关闭与进程的所有通信并终止它
kill()终止当前进程,使其立即退出
terminate()尝试终止进程
arguments()返回上次启动进程时使用的命令行参数
atEnd()如果进程未运行,并且没有更多数据可供读取返回true否则返回false
closeReadChannel()关闭读取通道通道。调用此函数后,QProcess将不再接收通道上的数据。已收到的任何数据仍可供读取。
closeWriteChannel()计划关闭 QProcess  的写入通道。将所有数据写入进程后,通道将关闭。调用此函数后,任何写入进程的尝试都将失败。
error()返回上次发生的错误类型
execute()阻塞
exitCode()返回最后一个完成的进程的退出代码
exitStatus()返回最后一个完成的进程的退出状态
open()类似start(),但仅用于完全实现QIODevice定义的接口
processld()返回正在运行的进程的本机进程标识符
program()返回上次启动进程的程序
readAllStandardError()无论当前读取通道如何,此函数都将进程标准错误中可用的所有数据作为 QByteArray 返回。
readAllStandardOutput()无论当前读取通道如何,此函数都将进程标准输出中的所有可用数据作为 QByteArray 返回。
readChannel()返回当前通道
readData()读取数据
writeData()写入数据
workingDirectory()如果已为 QProcess 分配了一个工作目录,则此函数返回 QProcess 在程序启动之前将进入的工作目录。
state()返回进程的当前状态
setWorkingDiaectory()设置工作目录
setStandardOutPutProcess()通过管道将此进程的标准输出流传送到目标进程的标准输入
setProgram()设置启动进程时要使用的程序
setArguments()设置在启动进程时要传递给被调用程序的参数
setInputChannelMode()将 QProcess 标准输入通道的通道模式设置为指定的模式
setProcessChannelMode()将 QProcess 标准输出和标准误差通道的通道模式设置为指定的模式
setProcessEnvironment()设置 QProcess 将传递给子进程的环境
setProcessState()指定状态
setReadChannel()设置读取通道
setStandardErrorFile()将进程的标准错误重定向到文件名。当重定向到位时,标准错误读取通道将关闭
setStandardInputFile()将进程的标准输入重定向到文件名指示的文件
setStandardOutputFile()将进程的标准输出重定向到文件名。当重定向到位时,标准输出读取通道将关闭
waitForBytesWrite(int)阻塞,直到有数据写到进程
waitForFinished(int)阻塞,直到进程完成并且发出 finish() 信号,或者直到毫秒后过去。
waitForReadyRead(int)阻塞,直到当前通道上有可读的数据
waitForStarted(int)阻塞,直到进程启动并发出 start() 信号,或者直到毫秒过去

信号:

errorHappen()错误发生发出
done()完成时发出
strated()进程启动时发出
stateChanged()状态发生变化时发出

QProcess 允许您将进程视为顺序 I/O 设备。您可以写入和读取进程,就像使用 QTcpSocket 访问网络连接一样。然后,您可以通过调用 write() 来写入进程的标准输入,并通过调用 read()、readLine() 和 getChar() 来读取标准输出。由于它继承了QIODevice,因此QProcess也可以用作QXmlReader的输入源,或者用于生成使用
QNextworkAccessManager上传的数据 

 启动一个程序的方式有两种:

  • strat()  主程序关闭, 进程也关闭
  • startDetached() 主程序关闭,进程不会关闭
QProcess::start(const QString &program, const QStringList &arguments, QIODevice::OpenMode mode = ReadWrite)

//第一个参数为:需要打开的程序
//第二个参数为:传递的命令行参数,程序会执行该命令
//第三个参数为:打开模式,一般使用默认值

//第一种创建的格式:
QString program="路径"
QStringList arguments;
arguments<<"命令"<<...(可以有多个);
process->start(program,arguments);//启动
//第二种创建的格式:

QString program="路径"
QStringList arguments;
arguments<<"命令"<<...(可以有多个);
process->setProgram(program);//设置程序
process->setArguments(arguments);
process->start();//启动

启动一个系统进程:

在头文件中添加:

QProcess *p;//进程对象

在构造函数中添加:

    p=new QProcess(this);
    p->start("notepad.exe");//开启进程

notepad.exe 为记事本,因为该程序的具体目录添加到系统PATH,所以不用具体给出

 运行结果:

启动非系统程序:

获取桌面软件路径的方法:

1.右键点击该软件,点击属性

2.复制该目标里面的路径即可

使用时把 \ 改为\\ 或 /(这是路径访问的规则)

 原路径: D:\迅雷下载\Thunder\Program\ThunderStart.exe

修改后的路径 :D:\\迅雷下载\\Thunder\\Program\\ThunderStart.exe

                          或D:/迅雷下载/Thunder/Program/ThunderStart.exe 

 非系统程序路径的规则

  • 路径内有空格,不能直接启动(启动不了)
  • 有空格的话可以使用带参模式才可以启动

带参模式的格式:process->start("路径",QStringList("路径"))

1.路径带空格启动不了 

//使用带空格的路径不会启动
p->start("C:/Program Files (x86)/QQ/Bin/QQScLauncher.exe");//启动不了QQ

2. 不带空格的路径可以字节启动

//不带空格的可以启动
p->start("D:/迅雷下载/Thunder/Program/ThunderStart.exe");//启动迅雷

3.带空格的路劲可以使用带参模式启动 

p->start("C:/Program Files (x86)/QQ/Bin/QQScLauncher.exe"
             ,QStringList("C:/Program Files (x86)/QQ/Bin/QQScLauncher.exe"));//启动QQ

  使用参数来执行命令:

//使用Qt Creator 打开一个项目
    QStringList list;
    list<<"D:/Qt_Android_work/UDP_Socket/UDP_Socket.pro";//存放项目路径
    //打开Qt Creator 打开 UDP_Socket项目
    p->start("D:/QT/Tools/QtCreator/bin/qtcreator.exe",list);

运行结果:

使用信号可以获取一些信息:

创建一个新项目:

头文件中添加:

QProcess *process;

ui界面中添加两个QPushButton (打开进程),转到槽选择clicked()信号       

 .cpp的全部内容:

#include "process.h"
#include "ui_process.h"
#include<QProcess>
#include<QDebug>
#include<QMessageBox>
process::process(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::process)
{
    ui->setupUi(this);

    p=new QProcess(this);
    connect(p,&QProcess::started,[=]()//启动完成
    {
        qDebug()<<"进程已启动";
    });
    connect(p,&QProcess::stateChanged,[=]()//进程状态改变
    {
        if(p->state()==QProcess::Running)
        {
            qDebug()<<"正在运行";
        }
        else if(p->state()==QProcess::NotRunning)
        {
            qDebug()<<"不在运行";
        }
        else
        {
            qDebug()<<"正在启动";
        }
    });
    connect(p,&QProcess::errorOccurred,[=]()
    {
        qDebug()<<p->errorString();//输出错误信息
    });
}

process::~process()
{
    delete ui;
}

void process::on_pushButton_clicked()//开起进程
{
    p->start("C:\\Program Files (x86)\\QQ\\Bin\\QQScLauncher.exe",
             QStringList("C:\\Program Files (x86)\\QQ\\Bin\\QQScLauncher.exe"));//开启QQ登录程序
}

 同步进程接口:

QProcess 提供了一组函数,允许在没有事件循环的情况下使用它,方法是挂起调用线程直到发出某些信号

  • waitForStarted()直到进程启动
  • waitForReadyRead() 直到新数据可用于当前读取通道上的读取
  • waitForBytesWrite() 直到一个数据有效负载被写入进程
  • waitForDone()直到进程完成

官方案例:

 下面的示例运行以压缩字符串“Qt rocks!”,而不使用事件循环:gzip

    QProcess gzip;
    gzip.start("gzip", QStringList() << "-c");
    if (!gzip.waitForStarted())
        return false;

    gzip.write("Qt rocks!");
    gzip.closeWriteChannel();

    if (!gzip.waitForFinished())
        return false;

    QByteArray result = gzip.readAll();

参考文档:

Q课程|类Qt核心 5.15.12

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

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

相关文章

Pycharm 中Torch安装方法

1.使用自带工具安装依次打开菜单&#xff1a;File->Setting点击号&#xff0c;搜索torch选择1.13.0版本安装安装错误&#xff1a;具体包含很长一段错误记录&#xff0c;如下&#xff1a;Collecting torch1.13.0Downloading https://files.pythonhosted.org/packages/ec/5e/8…

网络协议栈简单设计(tcp)

网络协议栈简单设计(tcp) 接着这篇文章写的 TCP相对于Udp&#xff0c;分为两个部分&#xff1a;连接&#xff08;三次握手、四次挥手&#xff09;、交互&#xff08;数据传输&#xff09; 三次握手 tcp包结构体定义 依照tcp包头字段定义就行&#xff1a; 注意&#xff0c;…

jenkins配置

ssh配置 选择Manager Jenkins 选择Configure System&#xff0c;进入页面一直拉到底 Remote Directory&#xff1a;是你需要从jenkins服务拷贝到远程应用服务指定的目录 高级&#xff1a;可以配置ssh密码 配置maven&#xff0c;git&#xff0c;jdk 选择 Global Tool Configur…

dpdk无锁队列rte_ring实现分析

1. 概述 rte_ring(以下简称ring)是一个高效率的无锁环形队列&#xff0c;它具有以下特点&#xff1a; FIFO队列长度是固定的&#xff0c;所有指针存放在数组中无锁实现(lockless)多消费者或单消费者出队多生产者或单消费者入队批量(bulk)出队 - 出队N个对象&#xff0c;否则失…

05.抽象工厂模式

05.抽象工厂模式 概念 抽象工厂模式&#xff1a;提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无须指定他们具体的类。抽象工厂又称为Kit模式&#xff0c;属于对象创建型模式。 抽象工厂可以将统一产品族的单独工厂封装起来&#xff0c;在正常使用中&#xff0…

08.适配器模式

08.适配器模式 概念&#xff1a; 将一个类的接口转化成用户需要的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 适配器模式可以分为类适配器和对象适配器两种&#xff0c;区别在于适配器角色对应被适配角色的适配是通过继承还是组合…

单月涨粉30w+,他们掌握引流法宝,小红书1月创作趋势是什么?

新年来到&#xff0c;在刚过去的1月&#xff0c;小红书平台涌现出哪些黑马博主&#xff1f;品牌在投放种草方面有何亮眼表现&#xff1f;为洞察小红书平台的内容创作趋势及品牌营销策略&#xff0c;新红推出1月月度榜单&#xff0c;从创作者及品牌两方面入手&#xff0c;解析月…

计算机网络-I/O多路复用机制

I/O多路复用机制 I/O多路复用&#xff08;multiplexing&#xff09;的本质是通过一种机制&#xff08;系统内核缓冲I/O数据&#xff09;&#xff0c;让单个进程可以监视多个文件描述符&#xff08;File descriptor是计算机科学中的一个术语&#xff0c;是一个用于表述指向文件的…

2.11 PID控制算法(四)补充

文章目录 1、理论1、代码3、分析3.1 比例项:3.2 比例+积分3.3 比例+积分+微分1、理论 1、代码 typedef struct {s32 Uplimit; //输出限幅s32 Downlimit; //输出限幅s32 target; // 目标输出量s3

leveldb源码解析二——SSTable

本章解析leveldb的基本组件——SSTable&#xff0c;SSTable一旦形成&#xff0c;就不会被改变&#xff0c;SSTable的操作有以下2种&#xff1a; 1、构建SSTable&#xff0c;在minor compaction和major compaction时&#xff0c;会构建SSTable&#xff0c;其中minor compaction是…

Opencv DNN C++ CPU 平台编译配置过程

Opencv DNN C CPU 平台编译配置过程 以下内容基于 windows 平台&#xff0c;实际上不同平台在基础工具齐全的情况下&#xff0c;编译过程差异并不大。 opencv 随着版本的更新&#xff0c;对于不同算子的支持也会逐步完善&#xff0c;所以尽量使用新的版本。 同时也可以把对应…

TCP滑动窗口协议与流量控制

谈到TCP的滑动窗口协议与流量控制&#xff0c;便会想起2006年去华为-3COM&#xff08;现H3C公司时&#xff09;面试时的场景。 当年毕业后&#xff0c;刚刚学了一点TCP的皮毛&#xff0c;仅仅是知道了TCP是面向连接的协议&#xff0c;以对每个报文都进行确认超时重传的机制来保…

摸鱼时间,画个吃豆人玩一下

Ⅰ . 吃豆人小游戏 Canvas API&#xff08;画布&#xff09;是在 HTML5 中新增的标签用于在网页实时生成图像&#xff1b;是一个非常适合&#xff0c;做一些有趣的小游戏 和 动画&#xff1b;下面我们来简单的写一下 这个小例子 &#x1f447; 文章目录Ⅰ . 吃豆人小游戏Ⅱ. 实…

学习嵌入式必读十本书,从C语言到ARM

学习嵌入式必读的十本书籍&#xff0c;按照C语言、数据结构、Linux、C、QT、单片机、ARM的顺序给大家推荐。 01 C语言 凡是计算机、电子、通信、自动化、机械专业的同学&#xff0c;大一的时候必学C语言&#xff0c;而且大部分高校选择的教材都是谭浩强。这本书在网上的评价褒…

【计算机程序设计思想与方法】2 什么是计算思维?

1.2 什么是计算思维? 如《【计算机程序设计思想与方法】1 什么是计算?》中所述,计算是利用计算机一步一步地执行指令来解决问题的过程,计算机科学是关于计算的科学。 正如数学家在证明数学定理时,有独特的数学思维。工程师在设计制造产品时,有独特的工程思维。艺术家在…

【验证码逆向专栏】某验“初代”滑块验证码逆向分析

声明 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 本文章未经许可禁止转载…

【算法】递归

目录1.递归概述2.何时使用递归2.1.定义是递归的2.2.数据结构是递归的2.3.问题的求解方法是递归的3.递归模型4.应用本文参考&#xff1a; 《数据结构教程》第 5 版 李春葆 主编 1.递归概述 &#xff08;1&#xff09;在定义一个过程或函数时&#xff0c;出现直接或者间接调用自…

【微服务】Elasticsearch文档索引库操作(二)

&#x1f697;Es学习第二站~ &#x1f6a9;Es学习起始站&#xff1a;【微服务】Elasticsearch概述&环境搭建(一) &#x1f6a9;本文已收录至专栏&#xff1a;微服务探索之旅 &#x1f44d;希望您能有所收获 一.索引库操作 索引库就类似数据库表&#xff0c;mapping映射就类…

DGIOT低代码场景部门的搭建过程

[小 迪 导读] : 通过低代码页面与konva 大屏的页面设计,围绕部门&#xff0c;实现应用场景快速搭建1.部门创建以及权限分配1.1 打开部门管理页面1.2新增部门1.3 权限分配&#xff0c;点击刚创建的部门&#xff0c;在菜单分配中选择总控台和设备管理(低代码平台会过滤掉非低代码…

Wandb:make visualization better than Tensorboard

Wandb&#xff1a;make visualization better than Tensorboard wandb :一个在线的可多人协作的多功能可视化工具包 我最开始使用的tensorboard&#xff0c;还写了一些相关tensorboard的脚本用于实验。tensorboard这里就不详细介绍了&#xff0c;相信大家都比较了解。直到尝试了…