чтение вывода 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() 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());

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


вы не должны использовать QProcess::execute метод, он статичен и не изменяет ваш pingProcess переменной. У вас нет доступа к процессу, запущенному с помощью этого метода. Вам нужно использовать метод. Обратите внимание, что этот метод является асинхронным. Вам нужно использовать 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();