我有一个像这样使用 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"
我想将此输出作为 QString 获取(读取)。我搜索了这个,但找不到解决方案。
提前致谢。
你试过了吗
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());
以更 Qt 的方式,您可以尝试使用 readyReadStandardOutput 信号:
connect(&pingProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(readData()));
并在相应的插槽中将 readData 写入字符串
QString 输出 = 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();