【问题标题】:read QProcess output to string将 QProcess 输出读取到字符串
【发布时间】:2013-06-27 13:41:13
【问题描述】:

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

我想将此输出作为字符串读取(读取)。我搜索了这个,我找不到解决方案。提前致谢。

【问题讨论】:

    标签: c++ qt stdout qstring qprocess


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

        QString 输出 = pingProcess.readAllStandardOutput();

        【讨论】:

        • 虽然这是正确的,但您应该知道,如果进程创建了大量输出,您可能会在进程完成之前收到对 readData 槽的多次调用,因此需要处理数据并仍然等待进程完成的信号。
        • True, connect( &pingProcess, SIGNAL(finished (int)), this, SLOT(handleProcessFinish(int); 这样你就不会阻塞流程(另外 waitFofFinished 有 30 秒的默认超时)。
        • 是的,但是 30 秒是等待的最长时间。如果该过程在此之前完成,它将返回。
        • 但如果超过 30 秒,输出将不可用,这可能是有害的 ;)
        • 默认情况下是的,但是您应该知道您所调用的进程会发生什么。另请注意,如果需要,为超时传递 -1 将确保它永远不会自动超时。我并不是说必须使用此功能,而是为了方便起见。如果过程很短,例如获取目录列表,那么您会期望它非常快并且可以等待它完成,这样可以减少代码。
        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2014-07-08
          • 1970-01-01
          • 2015-07-18
          • 1970-01-01
          • 1970-01-01
          • 2013-10-04
          • 2011-08-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多