繁体   English   中英

我如何阅读QProcess?

[英]How do I read from QProcess?

我有这个简单的C ++程序:

int main(int argc, char *argv[])
{

    QCoreApplication a(argc, argv);

    QProcess ps;
    QByteArray ba;

    ps.start("ls J:");
    ba = ps.readAllStandardOutput();
    char *someData = ba.data();

    cout << "Testing QProcess ..." << endl;
    cout << someData << endl;
    cout << "done!" << endl;

    return a.exec();
}

输出是:

Testing QProcess ...


done!

如果我从Windows cmd运行“ls J:”它可以工作。 我错过了什么?

在循环中使用QIODevice :: waitForReadyRead() ,只有在返回之后,才调用readAllStandardOutput() 正如文档中所述, QProcess::readAllStandardOutput()将读取所有可用数据,但不会等待。 在开始阅读之前,您需要等待QProcess::waitForStarted()启动该过程。

快速未经测试的部分代码,替换行ba = ps.readAllStandardOutput(); 有了这个:

if (ps.waitForStarted(-1)) {
    while(ps.waitForReadyRead(-1)) {
        ba += ps.readAllStandardOutput();
    }
}
// else report error or whatever

当出现错误或子进程终止时,应该退出循环,但在此之前保持读取,没有超时。

注意:在“常规”Qt程序中,您将运行事件循环,然后您不会调用waitForReadyRead()或其他类似的便捷函数。 他们会阻止事件循环并停止其他一切。 在这样的程序中,你最好使用信号和插槽,或者用线程开始乱码(但这通常不是优选的,它只会增加不必要的复杂性)。

QProcess文档说,当有可读数据时, QProcess对象会发出信号: readyRead()readyReadStandardOutput()以及readyReadStandardError()

最简单的方法是将这些信号连接到您的插槽,并使用例如。 readAllStandardOutput()那里。

当然hydes循环也有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM