Подтвердить что ты не робот

Чтение вывода 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"

Я хочу взять (прочитать) этот вывод как строку. Я искал это, и я не могу найти решение. Спасибо заранее.

4b9b3361

Ответ 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();