C++ 将QProcess输出读取为字符串

C++ 将QProcess输出读取为字符串,c++,qt,stdout,qstring,qprocess,C++,Qt,Stdout,Qstring,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" <<

我有一个像这样使用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();
}

我想把这个输出作为字符串(读取)。我寻找这个,但我找不到解决办法。提前感谢。

您是否尝试过
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(),它是一个静态方法。您应该从QProcess的实例调用start()

然后用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
变量。您无权访问使用此方法启动的进程。您需要改用
start()
方法。请注意,此方法是异步的。您需要使用
waitForFinished
,然后读取数据

pingProcess.start(exec, params);
pingProcess.waitForFinished();
QByteArray output = pingProcess.readAllStandardOutput();

您可以尝试使用readyReadStandardOutput信号:

connect(&pingProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(readData()));
并在相应的插槽中读取字符串的数据

QString输出=pingProcess.readAllStandardOutput()


虽然这是正确的,但您应该知道,如果进程创建了大量输出,您可能会在进程完成之前收到对readData插槽的多个调用,因此需要处理数据连接,并仍然等待信号以完成进程。True,connect(&pingProcess,signal(finished(int)),this,slot(handleProcessFinish(int);这样您就不会阻止流(另外WaitFoffished有30秒的默认超时)。是的,但30秒是等待的最长时间。如果进程在此之前完成,它将返回。但是如果超过30秒,输出将不可用,这可能会造成伤害;)默认情况下,是的,但您应该知道调用的进程会发生什么。还要注意,如果需要,将-1传递给超时将确保它不会自动超时。我不是说必须使用此函数,而是为了方便起见。如果进程非常短,例如获取目录列表,则嗯,你会期望它非常快,可以等待它完成,这允许更少的代码。
connect(&pingProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(readData()));