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