//注意,
mProcess为共享指针
,要特别注意,
信号和槽的连接要使用原始指针
(也就是mProcess.get()函数)
std::shared_ptr<QProcess> mProcess;
mProcess = std::make_shared<QProcess>();
mProcess->setProgram(cmd);
mProcess->setArguments(splitProcessCommand(arguments));
mProcess->setProcessChannelMode(QProcess::MergedChannels); //设置读取标准输出模式
mProcess->setProcessEnvironment(env); //设置环境变量
mProcess->setWorkingDirectory(workingDir); //这种工作目录
ok = connect(mProcess.get(), &QProcess::readyReadStandardError,[this](){
this->log(QString::fromLocal8Bit( mProcess->readAllStandardError()));
ok = connect(mProcess.get(), &QProcess::readyReadStandardOutput,[this](){
//这样就实现把结果exe的信息给显示在控制台了
this->log(QString::fromLocal8Bit( mProcess->readAllStandardOutput()));
mProcess->start();
mProcess->waitForStarted(5000);
//这里可以给它传入一些数据
mProcess->write(readFileToByteArray(mInputFile));
mProcess->closeWriteChannel();
//如果啥时候想终止这个进程,还可以用下面的代码
mProcess->closeReadChannel(QProcess::StandardOutput);
mProcess->closeReadChannel(QProcess::StandardError);
mProcess->closeWriteChannel();
mProcess->terminate();
mProcess->kill();
//这里面就能获得启动的exe的标准输出信息了
void DebugTarget::log(const QString &msg)
emit debugTargetOutput(msg);
特别注意:
如果需要修改process的控制台窗口是否显示,则用下面的函数
mProcess->setCreateProcessArgumentsModifier([this](QProcess::CreateProcessArguments * args)
//下面这两行让后台exe弹出一个窗口
args->flags |= CREATE_NEW_CONSOLE;
args->flags &= ~CREATE_NO_WINDOW;
切记:在这个函数里,下面这一行,千万不要用,否则qprocess关闭了标准输出,我们就获取不到输出了(我踩了这个巨坑,一天才找出来)
args->startupInfo -> dwFlags &= ~STARTF_USESTDHANDLES;
当然,如果不通过信号与槽函数机制,自己主动去读取mProcee的标准输出也可以的,那就用
mProcee->readAll()
mProcee->write()
/下面这两行让后台exe弹出一个窗口。如果需要修改process的控制台窗口是否显示,则用下面的函数。在这个函数里,下面这一行,千万不要用,否则qprocess。,我们就获取不到输出了(我。
QProcess类用于启动外部程序并与它们通信。
QProcess允许将进程视为I/O设备。可以像使用qtcsocket访问网络连接一样对进程进行写入和读取。然后可以通过调用write()写入进程的标准输入,并通过调用read()、readLine()和getChar()读取标准输出。因为QProcess继承了QIODevice,所以它还可以用作QXmlReader的输入源,或者用于生成要使用QNetworkAccessManager上载的数据。
当进程退出时,QProces
在QT程序中我们经常需要与其他的程序间进行交互,而与终端进行交互就是一个例子。在不需要获取返回信息的情况下我们可以直接使用"system()"函数执行,但是当需要获取执行的结果或者需要实时地将结果输出到窗口上时,就比较难办了,需要涉及进程管道等等。而QT提供的QProcess类则大大简化了这一过程。
QProcess是QT提供的与外部程序进行交互的一个类,主要使用到以下的函数:
sta...
本例介绍如何使用QProcess启动进程并实时获取启动进程的标准输出后显示。
本例在QT的MainWindow 启动后会每个1秒在控制台打印ping的log,如下图所示
#include "mainwindow.h"
#include <QApplication>
#include <QProcess>
#include <QDebug>
int main(int argc, char *argv[]) {
QApplication a(argc
QStringList arguments;
arguments << "/c" << "netstat -tno|findStr ***.***.***.***(ip地址)";
QProcess process(this);
process.start("cmd.exe", arguments);
process.waitForStart...
一、函数接口
QProcess类提供了三个函数
1、QProcess::execute() 以堵塞方式的执行shell命令,当命令执行完成后,调用进程才会继续执行。命令输出的任何数据都将转发给调用进程输出(因此无法捕获)。
2、QProcess::start() 以异步方式的执行shell命
Qt5是一款功能强大的C++开发框架,在其中包含了QProcess类,该类可以实现进程的创建和进行管道通信。管道通信是一种进程间的数据传输方式,可以在不同进程间传递数据,实现进程间的通信。
在Qt5中使用QProcess类进行管道通信的方法如下:
1. 创建进程:使用QProcess类的start()函数创建进程,并将进程的输出流和输入流连接起来。
2. 读取和写入数据:使用QProcess类的write()函数向进程中写入数据,使用QProcess类的read()函数从进程中读取数据。
3. 处理数据:使用程序对数据进行处理,并将处理结果输出到输出流中。
4. 关闭进程:使用QProcess类的close()函数关闭进程,结束管道通信。
使用Qt5的QProcess类进行管道通信可以同时执行多个进程,并且可以实现跨平台,支持Windows、Linux等操作系统。同时QProcess类还提供了许多其他的功能,比如可以获取进程的运行状态,可以获取进程错误信息等。因此,在Qt5框架的开发过程中,使用QProcess类进行管道通信可以大大提高开发效率,减少开发难度。
Mr-Apple:
latex排版原理 常用算法排版伪代码模块 添加注释以及注意事项
qq_43133348: