Qt 进程(基本用法)

进程的使用情况:

  • 运行的当前的应用中调用外部程序来实现功时调使用到进程。
    • 比如:在你的运行程序中,开启迅雷或开启其他程序
  • 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

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值