2014-03-25 6 views
1

레이블에 응답을 출력하고자하는 QProcess가 있습니다. 우선, 여기 내가 시도한 것입니다 :레이블 QContcess 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을 받아들입니다. 내가 읽은 바로는 QString에 QByteArray를 캐스팅 할 수 있어야합니다. 작동하지 않습니다. 나는 또한 QString 클래스와() 된 proc> 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 (이미지))

아무쪼록 고맙습니다. 고맙습니다.

업데이트 :

내가 위의 코드 블록이, 내가 텍스트가 라벨에 추가 볼 수 있습니다 속해있는 방법 끝나기 전에 QMessageBox를 추가하는 경우. 그러나 QMessageBox 닫을 때 텍스트가 사라집니다. 내가 proc -> readAll()을 사용하여 레이블에 주소 위치를 부여했거나이 동작이 어떻게 발생 했습니까? 고맙습니다.

+0

당신이 "작동하지 않는"상태, 당신은 무엇을 의미합니까? 컴파일되지 않거나 예상 한 것과 다른 결과를 얻고 있습니까? QString (const QByteArray & ba) – TheDarkKnight

+0

문자열 배열을 사용하여 바이트 배열에서 QString을 생성하는 것은 매우 합법적입니다. 불분명하다면 죄송합니다. 그것은 알맞게 컴파일합니다. 텍스트가 레이블에 추가되지 않은 것입니다. – 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를 추가하면 라벨의 출력 텍스트를 볼 수 있지만 messagebox를 닫으면 텍스트가 사라진다는 것을 알게되었습니다. 이 질문을 내 질문에 추가했습니다. – Attaque