首页 文章

将QProcess输出读取为字符串

提问于
浏览
18

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

  • 30

    你试过 QByteArray QProcess::readAllStandardOutput() docs - 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());
    
  • 4

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

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

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

  • 1

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

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

    并在相应的槽中readData到字符串

    QString输出= pingProcess.readAllStandardOutput();

相关问题