2014-03-25 50 views
1

我有一個QProcess,我想在標籤中輸出響應。首先,這裏是我曾嘗試:輸出QProcess readAll對標籤的響應

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-> readAll()是一個QByteArray中和的setText接受的QString。從我讀過的內容來看,我應該能夠將QByteArray轉換爲QString,但不管它如何工作。我也試圖轉換PROC-> readAll()與QString類

->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(圖) )

任何幫助表示感謝,謝謝。

更新

如果我認爲上面的代碼塊屬於,我可以看到文本添加到標籤的方法的結束前添加QMessageBox提示。但是,當我關閉QMessageBox時,文本消失。我是用proc-> readAll()給這個標籤賦予一個地址位置,或者是如何產生這種行爲?謝謝。

+0

當你說出「這是行不通的」,你是什麼意思?它不會編譯,或者正在獲得與您所期望的不同的輸出?使用字符串構造函數從字節數組創建QString是完全合法的:QString(const QByteArray&ba) – TheDarkKnight

+0

對不起,如果我不清楚。它編譯好,只是文本不附加到標籤。 – Attaque

回答

3

這裏的問題是,我們在調用PROC-> 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"); 
} 
+0

有道理!謝謝Merlin069! – Attaque

1

你應該聽readyReadStandardOutput()信號和通話readAll()當你收到信號。

,或者你可以在調用readAll之前調用

bool waitForReadyRead(int msecs = 30000) 

()。

+0

謝謝你的回答。我嘗試了waitForReadyRead(),不幸的是沒有任何運氣。我只是發現,如果我添加一個QMessageBox,我可以看到標籤中的輸出文本,但是當我關閉消息框時,文本消失。請參閱我添加到我的問題的編輯。 – Attaque