SAKURUG TECHBLOG

QProcessを使用して外部のプログラムを実行する

timestampauthor-name
Hayato

Qtとは

Qt(キュート)は、クロスプラットフォーム、多言語対応のアプリケーションフレームワークです。

※クロスプラットフォーム:Windows、macOS、Linux、iOS、Android等、様々なプラットフォームで動作します。

※多言語対応:C++、Python、JavaScript、Java等が利用できます。

QProcess

外部プログラムを起動し、それらと通信するために使用されるクラスです。

使用例

lsコマンドを実行してその出力を取得する。


QProcess proess;                           // QProcessクラスオブジェクト
QStringList arg;                           // 引数を設定するための変数

arg << "-l";                              // 引数の設定

process.setProgram("/tmp/ls", arg);        // 実行するコマンド

process.start();                           // プログラムを起動

process.waitForFinished();                 // プログラムが終了するまで待機

QByteArray data =                          /* 

process.readAllStandardOutput();           実行結果を取得する。

qDebug() << data;                          */


このようにQProcessを使うことでQtアプリケーションから外部プログラムを簡単に操作できます。

タイムアウト設定

waitForFinished()は引数でタイムアウト時間を設定できます。

waitForFinished(3000)とした場合3000ms(3秒間)応答がない場合タイムアウトとなり処理を中断することができます。以下に例を示します。


// プロセスが3秒以内に終了しない場合にfalseを返す
if (!process.waitForFinished(3000))  
{
    // エラーメッセージを表示
    qDebug() << "Error: Process timed out.";
}
// 正常終了
else
{
    // 標準出力を取得して表示する
    QByeteArray output = process.readAllStandardOutput();

    qDebug() << output;
}


エラーメッセージの取得

エラーが発生した場合、errorString()メソッドを使用して詳細なエラーメッセージを取得できます。


if(!process.waitForFinished())
{
    QProcess::ProcessError error = process.error();

    switch(error)
    {
        // プロセス起動失敗
        case QProcess:FailedToStart: 
            qDebug() << "Failed to start the process.";
            break;

        // プロセス実行中にクラッシュ
        case QProcess:Crashed: 
            qDebug() << "The process crashed.";
            break;

        // プロセスが指定した時間内に終了しなかった
        case QProcess:Timeout: 
            qDebug() << "The process timedout.";
            break;

        // プロセスへの書き込みエラー
        case QProcess:WriteError: 
            qDebug() << "Failed to write to the process.";
            break;

        // プロセスからの読み取り失敗
        case QProcess:ReadError: 
            qDebug() << "Failed to read from the process.";
            break;

        // その他の不明なエラー
        case QProcess:UnknownError: 
        default:
            qDebug() << "An unknown error occurred:" << process->errorString();
            break;
    }
}


これらのエラータイプを理解し、適切に処理することで、QProcessを使用する際の信頼性と安定性を向上させることができます。

記事をシェアする

ABOUT ME

author-image
Hayato
2020年中途入社。システムエンジニア。お客様の現場で業務システムの開発(Qt)を行っています。