Чтение вывода 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"
Я хочу взять (прочитать) этот вывод как строку. Я искал это, и я не могу найти решение. Спасибо заранее.
Ответы
Ответ 1
Вы попробовали QByteArray QProcess::readAllStandardOutput()
docs - здесь
QString может быть создан из QByteArray
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());
Ответ 2
@Shf является правильным в том, что вы должны использовать readAllStandardOutput. Однако вы используете функцию execute(), которая является статическим методом. Вы должны вызвать start() из экземпляра QProcess.
Также может быть хорошей идеей либо дождаться данных с помощью 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 и подключиться к готовому() сигналу, чтобы подключиться слот для чтения данных.
Ответ 3
Нельзя использовать метод QProcess::execute
, он статический и не изменяет вашу переменную pingProcess
. У вас нет доступа к процессу, запущенному с использованием этого метода. Вместо этого вам нужно использовать метод start()
. Обратите внимание, что этот метод является асинхронным. Вам нужно использовать waitForFinished
, а затем прочитать данные.
pingProcess.start(exec, params);
pingProcess.waitForFinished();
QByteArray output = pingProcess.readAllStandardOutput();
Ответ 4
В более Qt-способе вы можете попробовать использовать сигнал readyReadStandardOutput:
connect(&pingProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(readData()));
и в соответствующем слоте readData для строки
QString output = pingProcess.readAllStandardOutput();