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