我有一个QProcess,我想在标签中输出响应。首先,这是我尝试过的:
QProcess *proc = new QProcess();
proc->setProcessChannelMode(QProcess::MergedChannels);
proc->start(cmdLineRequest.toUtf8().constData()); // cmdLineRequest is omitted
if (!proc->waitForFinished()) {
qDebug() << "Make failed:" << proc->errorString();
ui->topBarcode->setText(QString(proc->errorString()));
} else {
qDebug() << "Make output:" << proc->readAll();
ui->topBarcode->setText(QString(proc->readAll()) + "asdf");
}
proc-&gt; readAll()是一个QByteArray,setText接受一个QString。根据我的阅读,我应该能够将QByteArray转换为QString,但它不起作用。我还试图用QString类转换proc-&gt; readAll()
->setText(QString::fromUtf8(proc->readAll())) // not working
->setText(QString::fromLatin1(proc->readAll())) // not working
->setText(QString::fromLocal8Bit(proc->readAll())) // not working
... etc ...
这看起来很奇怪,因为我使用setPixmap(QPixmap :: fromImage(image))将图片添加到几乎相同的标签中
感谢任何帮助,谢谢。
更新:
如果我在上面的代码块所属的方法结束之前添加一个QMessageBox,我可以看到添加到标签的文本。但是,当我关闭QMessageBox时,文本消失了。我用proc-> readAll()给标签的地址位置或者这个行为怎么样?谢谢。
答案 0 :(得分:3)
这里的问题是你要两次调用proc-&gt; readAll;第一个用于qDebug输出,然后再用于您在标签上设置的字符串。
{
qDebug() << "Make output:" << proc->readAll();
ui->topBarcode->setText(QString(proc->readAll()) + "asdf");
}
我希望由于QProcess是一个QIODevice,它会返回一个缓冲的字节数组。当你阅读它时,它会从缓冲区中删除它。
因此,在调用qDebug并将字符串设置为标签之前,创建一个临时字符串并读取缓冲区一次: -
{
QString output = proc->readAll();
qDebug() << "Make output:" << output;
ui->topBarcode->setText(output + "asdf");
}
答案 1 :(得分:1)
您应该收听readyReadStandardOutput
()信号并在收到信号时致电readAll()
。
或者你可以致电
bool waitForReadyRead(int msecs = 30000)
在致电readAll
()。