将QProcess readAll响应输出到label

时间:2014-03-25 00:39:47

标签: c++ qt qprocess qlabel

我有一个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()给标签的地址位置或者这个行为怎么样?谢谢。

2 个答案:

答案 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()。

之前