c++ qt stdout qstring qprocess

c++ - leer la salida de QProcess a la cadena



qt stdout (4)

¿ QByteArray QProcess::readAllStandardOutput() docs? here

QString se puede crear una instancia de QByteArray :

QString output(pingProcess.readAllStandardOutput());

Como han mencionado otros, y me uno a ellos, no debes usar el método de execute y reemplazarlo con:

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

Tengo un código que utiliza QProcess como este.

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

Esto produce lo siguiente.

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

Quiero tomar (leer) esta salida como una cadena. Busqué esto y no puedo encontrar la solución. Gracias por adelantado.


@Shf tiene razón en que debería usar readAllStandardOutput. Sin embargo, está utilizando la función execute (), que es un método estático. Debería llamar a start () desde una instancia de un QProcess.

También puede ser una buena idea esperar los datos con waitForReadyRead, o simplemente esperar a que el proceso finalice con waitForFinished ().

Además, hay una función de inicio sobrecargada, que le permite pasar todo el comando, lo que puede hacer que su código sea más fácil de leer:

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

Tenga en cuenta que llamar a waitForFinished bloqueará el proceso actual, por lo que si va a hacer algo que demorará un tiempo, querrá crear dinámicamente el QProcess y conectarse a la señal de finalización () para que una ranura conectada pueda leer los datos.


De una forma más Qt puede intentar usar la señal readyReadStandardOutput:

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

y en la ranura correspondiente readData a la cadena

QString output = pingProcess.readAllStandardOutput ();


No debe usar el método QProcess::execute , es estático y no altera su variable pingProcess . No tienes acceso a un proceso iniciado utilizando este método. Necesitas usar el método start() lugar. Tenga en cuenta que este método es asíncrono. waitForFinished usar waitForFinished y luego leer los datos.

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