QT之QProcess

类描述信息

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

启动进程

要启动一个进程,将要运行的程序的名称和命令行参数作为参数传递给start()。参数作为QStringList中的单个字符串提供。或者,您可以将程序设置为使用setProgram()和setArguments()运行,然后调用start()或open()。

cpp 复制代码
    QObject *parent;
    ...
    QString program = "./path/to/Qt/examples/widgets/analogclock";
    QStringList arguments;
    arguments << "-style" << "fusion";

    QProcess *myProcess = new QProcess(parent);
    myProcess->start(program, arguments);

然后QProcess进入Starting状态,当程序启动时,QProcess进入Running状态并发出started()。

通道通信

进程具有两个预定义的输出通道:

  1. 标准输出通道(stdout)提供常规控制台输出。
  2. 标准错误通道(stderr)通常提供由进程打印的错误。

这些通道代表两个单独的数据流,可以通过调⽤setReadChannel()函数在它们之间切换。当前读取通道上有可⽤数据时,QProcess发出readyRead()信号 。当有新的标准输出数据可⽤时,它也会**发出readyReadStandardOutput()**信号,⽽当有新的标准错误数据可⽤时,它会发出readyReadStandardError()信号。⽆需调⽤read()函数,readLine()函数或getChar()函数,⽽是可以通过调⽤readAllStandardOutput()函数或readAllStandardError()函数显式地从两个通道之⼀读取所有数据

查看CUP ID命令

QProcess p;
p.start("dmidecode -t 4 | grep ID |sort -u |awk -F': ' '{print $2}'");

以将整个命令作为sh的参数传入 或 使用QProcess::setStandardOutputProcess(QProcess *destination)即将一个进程的标准输出流传入目标进程的标准输入流:

cpp 复制代码
//将整个命令作为sh的参数传入
QProcess p;
p.start("sh", QStringList() << "-c" << "dmidecode -t 4 | grep ID |sort -u |awk -F': ' '{print $2}'");
p.waitForFinished();
QString str = p.readAllStandardOutput();
qDebug() << str;

//使用setStandardOutputProcess()
QProcess process1;                                
QProcess process2;                                
QProcess process3;                                
QProcess process4;                                
                                                  
process1.setStandardOutputProcess(&process2);     
process2.setStandardOutputProcess(&process3);     
process3.setStandardOutputProcess(&process4);     
                                                  
process1.start("sudo fdisk -l");                  
process2.start("grep ID");                        
process3.start("sort -u");                        
process4.start("awk", {"-F", ": ", "{print $2}"});
                                                  
process4.waitForFinished(); //等待最后一个命令执行完成               
QString str = process4.readAllStandardOutput();     
qDebug() << str;    

退出

cpp 复制代码
void kill()
void terminate()

kill(),作用是杀死当前进程使之退出。这个函数也是调用平台相关的 API,如在 Windows 上调用 TerminateProcess,而在 Unix 和 macOS 上是将 SIGKILL 信号发送到进程中。

terminate(),区别于 kill() 这种暴力的退出不同,它在退出进程的时候是有机会提示用户输入任何为保存的文件等。在 Windows 上是发送 WM_CLOSE 到进程的顶级窗口,然后发到进程本身的主线程,而 在 Unix 和 macOS 上是发送 SIGTERM 信号。注意在 Windows 上,没有事件循环或者不处理 WM_CLOSE 消息的控制台程序只能调用 kill() 来终止。

相关推荐
&岁月不待人&3 分钟前
Kotlin by lazy和lateinit的使用及区别
android·开发语言·kotlin
StayInLove6 分钟前
G1垃圾回收器日志详解
java·开发语言
无尽的大道14 分钟前
Java字符串深度解析:String的实现、常量池与性能优化
java·开发语言·性能优化
爱吃生蚝的于勒17 分钟前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
binishuaio27 分钟前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git
zz.YE29 分钟前
【Java SE】StringBuffer
java·开发语言
就是有点傻33 分钟前
WPF中的依赖属性
开发语言·wpf
洋24041 分钟前
C语言常用标准库函数
c语言·开发语言
进击的六角龙43 分钟前
Python中处理Excel的基本概念(如工作簿、工作表等)
开发语言·python·excel
wrx繁星点点44 分钟前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式