читать вывод 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"

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


person sersem1    schedule 27.06.2013    source источник


Ответы (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());
person Shf    schedule 27.06.2013

@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(), чтобы подключенный слот затем прочитать данные.

person TheDarkKnight    schedule 27.06.2013

Более Qt-способом вы можете попробовать использовать сигнал readyReadStandardOutput:

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

и в соответствующем слоте readData в строку

Выход QString = pingProcess.readAllStandardOutput();

person ariwez    schedule 27.06.2013
comment
Хотя это правильно, вы должны знать, что если процесс создает много вывода, вы можете получить несколько вызовов слота readData до завершения процесса, поэтому вам нужно обрабатывать конкатенацию данных и все еще ждать сигнала для окончание процесса. - person TheDarkKnight; 27.06.2013
comment
True, connect( &pingProcess, SIGNAL(finished (int)), this, SLOT(handleProcessFinish(int); Таким образом, вы не блокируете поток (кроме того, у waitFofFinished таймаут по умолчанию 30 секунд). - person ariwez; 27.06.2013
comment
Да, но 30 секунд - это максимальное время ожидания. если процесс завершится до этого, он вернется. - person TheDarkKnight; 27.06.2013
comment
Но если это займет более тридцати секунд, вывод будет недоступен, а это может навредить ;) - person ariwez; 27.06.2013
comment
По умолчанию да, но вы должны знать, чего ожидать от вызываемого вами процесса. Также обратите внимание, что передача -1 для тайм-аута гарантирует, что он никогда не будет автоматически тайм-аут, если это требуется. Я не говорю, что эту функцию нужно использовать, но она доступна для удобства. Если процесс очень короткий, например, получение списка каталогов, вы ожидаете, что он будет очень быстрым, и можете дождаться его завершения, что позволит сократить код. - person TheDarkKnight; 27.06.2013
comment
Я бы сказал: ожидайте худшего сценария. - person ariwez; 27.06.2013

Вы не должны использовать метод QProcess::execute, он статичен и не изменяет вашу переменную pingProcess. У вас нет доступа к процессу, запущенному с помощью этого метода. Вместо этого вам нужно использовать метод start(). Обратите внимание, что этот метод является асинхронным. Вам нужно использовать waitForFinished, а затем прочитать данные.

pingProcess.start(exec, params);
pingProcess.waitForFinished();
QByteArray output = pingProcess.readAllStandardOutput();
person Pavel Strakhov    schedule 27.06.2013