web-dev-qa-db-fra.com

lire la sortie QProcess dans la chaîne

J'ai un code qui utilise QProcess comme celui-ci.

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();
}

Cela génère les éléments suivants.

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

Je veux prendre (lire) cette sortie sous forme de chaîne. J'ai cherché cela et je ne peux pas trouver la solution. Merci d'avance.

19
sersem1

Avez-vous essayé QByteArray QProcess::readAllStandardOutput() docs - ici

QString peut être instancié à partir de QByteArray:

QString output(pingProcess.readAllStandardOutput());

Comme d'autres l'ont mentionné, et je les rejoins, vous ne devez pas utiliser la méthode execute et la remplacer par:

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

@Shf a raison en ce que vous devez utiliser readAllStandardOutput. Cependant, vous utilisez la fonction execute () qui est une méthode statique. Vous devez appeler start () à partir d'une instance d'un QProcess.

Il peut également être judicieux d'attendre les données avec waitForReadyRead ou d'attendre que le processus se termine avec waitForFinished ().

En outre, il existe une fonction de démarrage surchargée, qui vous permet de passer la commande entière, ce qui peut rendre votre code plus facile à lire: -

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());

Notez que l'appel de waitForFinished suspendra le processus en cours, donc si vous voulez faire quelque chose qui prendra un certain temps, vous voudrez alors créer dynamiquement le QProcess et vous connecter au signal finish () pour qu'un slot connecté se lire les données.

5
TheDarkKnight

De manière plus Qt, vous pouvez essayer d'utiliser le signal readyReadStandardOutput:

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

et dans le slot correspondant readData à la chaîne

Sortie QString = pingProcess.readAllStandardOutput ();

4
ariwez

Vous ne devez pas utiliser la méthode QProcess::execute, Elle est statique et ne modifie pas votre variable pingProcess. Vous n'avez pas accès à un processus démarré à l'aide de cette méthode. Vous devez utiliser à la place la méthode start(). Notez que cette méthode est asynchrone. Vous devez utiliser waitForFinished puis lire les données.

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