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