我有一个像这样使用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"
我想把这个输出作为字符串读取。我搜索了这个,我找不到解决方案。提前谢谢。
答案 0 :(得分:32)
您是否尝试过QByteArray QProcess::readAllStandardOutput()
个文档 - here
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());
答案 1 :(得分:5)
@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()信号以便连接插槽然后读取数据。
答案 2 :(得分:2)
以更多Qt方式,您可以尝试使用readyReadStandardOutput信号:
connect(&pingProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(readData()));
并在相应的槽readData中写入字符串
QString output = pingProcess.readAllStandardOutput();
答案 3 :(得分:1)
您不应使用QProcess::execute
方法,它是静态的,不会改变您的pingProcess
变量。您无权访问使用此方法启动的进程。您需要使用start()
方法。请注意,此方法是异步的。您需要使用waitForFinished
,然后阅读数据。
pingProcess.start(exec, params);
pingProcess.waitForFinished();
QByteArray output = pingProcess.readAllStandardOutput();