赞
踩
进程的使用情况:
- 运行的当前的应用中调用外部程序来实现功时调使用到进程。
- 比如:在你的运行程序中,开启迅雷或开启其他程序
- 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();
参考文档:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。