c++ 如何将QProcess输出读取到QString?

dba5bblo  于 2023-03-20  发布在  其他
关注(0)|答案(4)|浏览(213)

我有一个使用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读取。我搜索了这个问题,但找不到解决方案。
先谢了。

gmxoilav

gmxoilav1#

你试过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());
qmb5sa22

qmb5sa222#

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

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

并在相应的插槽中将readData写入字符串
QString输出= pingProcess.读取所有标准输出();

clj7thdc

clj7thdc3#

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

ljo96ir5

ljo96ir54#

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

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

相关问题