24

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

4 回答 4

42

您尝试过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());
于 2013-06-27T13:47:07.110 回答
6

@Shf 是正确的,因为您应该使用 readAllStandardOutput。但是,您使用的是静态方法的函数 execute()。您应该从 QProcess 的实例调用 start()。

然后使用 waitForReadyRead 等待数据,或者使用 waitForFinished() 等待进程完成也可能是一个好主意。

此外,还有一个重载的 start 函数,它允许您传递整个命令,这可能使您的代码更易于阅读:-

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() 信号,以便连接插槽到那时读取数据。

于 2013-06-27T13:54:05.057 回答
6

以更 Qt 的方式,您可以尝试使用 readyReadStandardOutput 信号:

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

并在相应的插槽中读取数据到字符串

QString 输出 = pingProcess.readAllStandardOutput();

于 2013-06-27T14:16:12.487 回答
1

你不应该使用QProcess::execute方法,它是静态的,不会改变你的pingProcess变量。您无权访问使用此方法启动的进程。您需要改用start()方法。请注意,此方法是异步的。您需要使用waitForFinished然后读取数据。

pingProcess.start(exec, params);
pingProcess.waitForFinished();
QByteArray output = pingProcess.readAllStandardOutput();
于 2013-06-27T13:54:19.970 回答