QT QProcess的使用


定義

The QProcess class is used to start external programs and to communicate with them.

QProcess類是用來啟動一個外部程序並與之通信。

使用說明

開啟外部線程的3中方式

To start a process, pass the name and command line arguments of the program you want to run as arguments to start(). Arguments are supplied as individual strings in a QStringList.

Alternatively, you can set the program to run with setProgram() and setArguments(), and then call start() or open().

想要啟動一個進程,可以傳遞你想啟動的程序的名字和命令行參數作為參數傳遞給start()函數。參數作為QStringList中每一個單獨的字符串。

或者,你可以通過setProgram()和setArguments()來設置該程序,然后調用start()或者open()啟動該程序。

啟動時在指定程序名時就附帶上參數

QProcess process;
process.start("cmd /c ping 127.0.0.1");

啟動時分別指定函數名和參數列表

QProcess process;
process.start("cmd", QStringList()<<"/c"<<"ping 127.0.0.1", QIODevice::ReadWrite);

分別指定函數名和參數,然后再啟動

QProcess process;
process.setProgram("cmd");
process.setArguments(QStringList()<<"/c"<<"ping 127.0.0.1");
process.start(QIODevice::ReadWrite);

一次性讀取進程輸出

void readProcessAllOnce(bool processAutoExit) {
    qDebug()<<"readProcessAllOnce, processAutoExit ="<<processAutoExit;
    qDebug()<<"----------------------";
    bool ret;
    QProcess process;
    QString command;
    if(processAutoExit) {
        command = "cmd /c ping 127.0.0.1";
    } else {
        command = "cmd /k ping 127.0.0.1";
    }
    process.start(command);
    /*
     * bool QProcess::waitForStarted(int msecs = 30000)
     */
    ret = process.waitForStarted();
    qDebug()<<"waitForStarted"<<ret;
    qDebug()<<QDateTime::currentDateTime();
    /*
     * 如果打開的不是自動關閉的進程,那么這里最多可能會等待30秒
     * bool QProcess::waitForFinished(int msecs = 30000)
     */
    ret = process.waitForFinished();
    qDebug()<<QDateTime::currentDateTime();
    qDebug()<<"waitForFinished"<<ret;
    QByteArray byteArray = process.readAllStandardOutput();
    QString str = QString::fromLocal8Bit(byteArray);
    qDebug()<<str;
    process.close();
    qDebug()<<"";
    qDebug()<<"======================";
}

這里寫圖片描述

按行讀取進程輸出

void readProcessByLine() {
    qDebug()<<"readProcessByLine";
    qDebug()<<"----------------------";
    bool ret;
    QProcess process(0);
    /*
     * cmd /c 的命令執行完后會關閉窗口
     * cmd /k 的命令執行完后不會關閉窗口
     *
     * aa && bb 就是執行aa,成功后再執行bb
     * aa || bb 先執行aa,若執行成功則不再執行bb,若失敗則執行bb
     * a  &  b  表示執行a再執行b,而無論a是否成功
     */
    process.start("cmd", QStringList()<<"/k"<<"ping 127.0.0.1"<<"&"<<"exit", QIODevice::ReadWrite);
//    process.setProgram("cmd");
//    process.setArguments(QStringList()<<"/k"<<"ping 127.0.0.1"<<"&"<<"exit");
//    process.start(QIODevice::ReadWrite);
    ret = process.waitForStarted();
    qDebug()<<"waitForStarted"<<ret;
    qint64 maxSize = 512;
    char buffer[maxSize];
    qint64 len;
    while(true) {
        /*
         * 一個waitForReadyRead信號可能輸出的是多行
         */
        ret = process.waitForReadyRead();
        qDebug()<<"waitForReadyRead"<<ret;
        if(!ret) {
            break;
        }
        while(true) {
            len = process.readLine(buffer, maxSize);
            qDebug()<<"buffer len"<<len;
            /*
             * 因為每一行至少還有回車換行符,因此讀到0,說明waitForReadyRead超時返回false
             */
            if(len <= 0) {
                break;
            }
            QString str = QString::fromLocal8Bit(buffer);
            qDebug()<<"qstring len"<<str.length();
            qDebug()<<str;
            qDebug()<<"";
        }
    }
    process.write("exit\r\n");
    ret = process.waitForFinished();
    qDebug()<<"waitForFinished"<<ret;
    process.close();
    qDebug()<<"";
    qDebug()<<"======================";
}

這里寫圖片描述

與進程交互

void openProcessThenWrite() {
    qDebug()<<"openProcessThenWrite";
    qDebug()<<"----------------------";
    bool ret;
    QProcess *process = new QProcess(QThread::currentThread());
    /*
     * 如果沒有QCoreApplication的話,會報如下錯誤
     * QObject::startTimer: Timers can only be used with threads started with QThread. timer只能在同一個線程中創建和啟動.
     */
    process->start("cmd", QIODevice::ReadWrite);
    ret = process->waitForStarted();
    qDebug()<<"waitForReadyRead"<<ret;
    QByteArray byteArray = process->readAllStandardOutput();
    QString str = QString::fromLocal8Bit(byteArray);
    qDebug()<<str;
    //這里不加換行的話命令發不出去
    qint64 len = process->write("ping 127.0.0.1\r\nexit\r\n");
    qDebug()<<"write len"<<len;
    while(true) {
        /*
         * 如果進程已經關閉,waitForReadyRead會直接返回false
         */
        ret = process->waitForReadyRead();
        qDebug()<<"waitForReadyRead"<<ret;
        if(!ret) {
            break;
        }
        byteArray = process->readAllStandardOutput();
        str = QString::fromLocal8Bit(byteArray);
        qDebug()<<str;
        qDebug()<<"";
    }
    /*
     * 如果沒有關閉cmd的指令,因此該process永遠不會finished,會超時(30秒)返回false
     */
    ret = process->waitForFinished();
    qDebug()<<"waitForFinished"<<ret;
    process->close();
    delete process;
    qDebug()<<"";
    qDebug()<<"======================";
}
  • 這里寫圖片描述

測試函數

#include <QCoreApplication>
#include <QDebug>
#include <QProcess>
#include <QThread>
#include <QDateTime>

void readProcessAllOnce(bool processAutoExit) {
    ……
}

void readProcessByLine() {
    ……
}

void openProcessThenWrite() {
    ……
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug()<<"======================";
    readProcessAllOnce(false);
    readProcessAllOnce(true);
    readProcessByLine();
    openProcessThenWrite();

    qDebug()<<"That's all";
    return a.exec();
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM