我有这个简单的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:”它可以工作。 我错过了什么?
答案 0 :(得分:5)
在循环中使用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()
或其他类似的便捷函数。他们会阻止事件循环并停止其他一切。在这样的程序中,你最好使用信号和插槽,或者开始使用线程(但这通常不是首选,它只会增加不必要的复杂性)。
答案 1 :(得分:3)
QProcess
documentation说,当有可供阅读的数据时,QProcess
对象会发出信号:readyRead()
和readyReadStandardOutput()
以及readyReadStandardError()
。
最简单的方法是将这些信号连接到您的插槽,并使用例如。 readAllStandardOutput()
那里。
当然,hydes循环也有效。