QProcess用法

QProcess用于在Qt应用中启动和管理外部程序,通过start()函数执行程序并传入参数。当进程启动后,可通过QIODevice接口进行读写操作。QProcess在进程完成启动后进入运行状态并发出started()信号,退出时发出finished()信号,提供exitCode()和exitStatus()获取退出信息。在进程运行中,如果发生错误,会发出error()信号。可以通过设置readChannel()合并或分开读取标准输出和错误。示例代码展示了如何使用QProcess启动netstat并读取其输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                QProcess类用于启动外部程序并与之通信。
启动一个新进程的方式:把待启动的程序名称和启动参数传递给start()函数即可。
例如:
QProcess *parent;
QString program = “tar”;
QStringList arguments;
arguments << "czvf" << "backup.tar.gz" << "/home";
QProcess *myProcess = new QProcess(parent);
QProcess->start(program,arguments);
当调用start()函数后,myProcess进程立即进入启动状态,但tar程序尚未被调用,不能读写标准输入输出设备,当进程完成启动后就进入“运行状态”并向外发出started()信号。在输入输出方面,QProcess将一个进程看做一个流类型的I/O设备,可以像使用QTcpSocket读写流类型的网络连接一样来读写一个进程,可以通过QIODevice::write()函数向后所启动的标准输入写数据,也可以通过QIODevice::resd().QIODevice::readLine()和QIODevice::getChar()从这个进程的标准输出读数据。此外由于QProcess是从QIODevice类继承而来的,所以它也可以作为QXmlReader的数据在源,或者为QFtp产生上传数据。最后,当进程退出时QProcess进入起始状态--“非运行状态”,并发出finish()信号。
void finished(int exitCode, QProcess::ExitStatus exitStatus)先好在进程中返回了进程退出的退出码和退出状态,可以调取exitCode()函数和exitStatus()函数分别获取最后退出进程的这两个值。其中“退出状态”只有正常退出和进程崩溃两种,分别对应值QProcess::NormalExit(值0)和Qprocess::CrashExit(值1)。当进程在运行中产生错误时,QProcess将发出error()信号,可以通过,调用error()函数返回最后一次产生错误的类型,并通过state()找出此时进程所处的状态。Qt定义了如下的错误类型代码:
错误常量                        值      描述
QProcess::FailedToStart        0       进程启动失败
QProcess::Crashed              1       进程成功启动后崩溃
QProcess::Timedout             2       最后一次调用waitFor...()函数超时.此时QProcess状态不变,并可以再次调用waitFor()类型的函数
QProcess::WriteError           3       向进程写入时出错.如进程尚未启动,或者输入通道被关闭时
QProcess::ReadError            4       从进程中读取数据时出错.如进程尚未启动时
QProcess::UnknownError         5       未知错误.这也是error()函数返回的默认值
进程的标准输出
stdout:通常用于控制台下输出
stderr:通常用于进程打印错误
它们本质上是两个独立的数据流.
可以通过调用setReadChanned()函数设置当前的读通道
当有可读数据时Qt将发发出readyRead()信号
如果是标准输出和标准错误通道中读取数据,还会发出readyReadStandardOutput()信号
如果是标准错误也会发出readyReadStandardError()信号
readAllStandardOutput()函数从标准输出通道中读取数据
readAllStandardErrot()函数从标准错误通道中读取数据
在进程启动以前以MergedChannels参数调用setReadChannelMode()函数可以把标准输出通道和标准输错误通道合并
例:
#include <QApplication>
#include <QProcess>
#include <QString>
#include <iostream>
int main (int argc, char *argv[])
{
    QApplication app(argc, argv);
   QProcess proc;
    QStringList arguments;
    arguments << "-na";
    proc.start("netstat", arguments);

    // 等待进程启动
    if (!proc.waitForStarted())
    {
        std::cout << "启动失败\n";
        return false;
    }
    // 关闭写通道,因为没有向进程写数据,没用到 
    proc.closeWriteChannel();

    // 用于保存进程的控制台输出
    QByteArray procOutput;
    // 等待进程结束
    while (false == proc.waitForFinished())
    {
        ;
    }
    // 读取进程输出到控制台的数据
    procOutput = proc.readAll();
    // 输出读到的数据
    std::cout << procOutput.data() << std::endl;
    // 返回
    return EXIT_SUCCESS;
}