web-dev-qa-db-ja.com

QProcess出力を文字列に読み込む

このようなQProcessを使用するコードがあります。

int main(int argc, char *argv[])
{
    int status=0;
    QProcess pingProcess;
    QString ba;
    QString exec = "snmpget";
    QStringList params;
     params << "-v" << "2c" << "-c" << "public" << "10.18.32.52" <<    ".1.3.6.1.4.1.30966.1.2.1.1.1.5.10";
    status=pingProcess.execute(exec, params);
    pingProcess.close();
}

これは以下を出力します。

SNMPv2-SMI::enterprises.30966.1.2.1.1.1.5.10 = STRING: "0.1"

この出力を文字列として取得(読み取り)したい。私はこれを検索しましたが、解決策を見つけることができません。前もって感謝します。

19
sersem1

試しましたかQByteArray QProcess::readAllStandardOutput() docs- here

QStringQByteArrayからインスタンス化できます:

QString output(pingProcess.readAllStandardOutput());

他の人が述べたように、そして私も彼らに加わっていますが、executeメソッドを使用しないでください。

pingProcess.start(exec, params);
pingProcess.waitForFinished(); // sets current thread to sleep and waits for pingProcess end
QString output(pingProcess.readAllStandardOutput());
33
Shf

@Shfは、readAllStandardOutputを使用する必要があるという点で正しいです。ただし、静的メソッドである関数execute()を使用しています。 QProcessのインスタンスからstart()を呼び出す必要があります。

その後、waitForReadyReadでデータを待つか、またはプロセスがwaitForFinished()で終了するのを待つことも良い考えです。

また、オーバーロードされた開始関数があり、コマンド全体を渡すことができるため、コードが読みやすくなります。-

QProcess pingProcess;
QString exe = "snmpget -v 2c -c public 10.18.32.52 .1.3.6.1.4.1.30966.1.2.1.1.1.5.10";
pingProcess.start(exe);
pingProcess.waitForFinished();
QString output(pingProcess.readAllOutput());

WaitForFinishedを呼び出すと、現在のプロセスがハングするので、しばらく時間がかかる処理を行う場合は、QProcessを動的に作成し、finished()シグナルに接続して、接続されているスロットをその状態にしてください。データを読み取ります。

5
TheDarkKnight

よりQtの方法では、readyReadStandardOutput信号を使用することができます。

connect(&pingProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(readData()));

そして、対応するスロットのreadDataで文字列に

QString出力= pingProcess.readAllStandardOutput();

4
ariwez

_QProcess::execute_メソッドは使用しないでください。これは静的で、pingProcess変数を変更しません。このメソッドを使用して開始されたプロセスにアクセスできません。代わりにstart()メソッドを使用する必要があります。このメソッドは非同期であることに注意してください。 waitForFinishedを使用して、データを読み取る必要があります。

_pingProcess.start(exec, params);
pingProcess.waitForFinished();
QByteArray output = pingProcess.readAllStandardOutput();
_
1
Pavel Strakhov