가능한 두 가지 포인트 : QProcess ::: state()는 Qt 이벤트 루프에 들어 가지 않으므로 반복적으로 호출하면 응용 프로그램이 업데이트되지 않습니다. 모든 Qt 논리가 중단됩니다. progressBar 초기화를 확인하십시오 : progressBar 속성 "maximum"이 정확히 100이 아니면 100 %에 도달하지 않습니다. 귀하의 "발"은 또한 "ProgressBar의"최대 무시, 그래서 수정이 필요합니다 :
if(val < ui->progressBar->maximum())
ui->progressBar->setValue(val++);
대부분의 작업이 여기에 명확하지 않다 진행의 명확한 개념을 가지고있다. while 루프가 너무 빨라서 진행 단계를 시각적으로 인식 할 수 없습니다. while 루프를 신호/슬롯 쌍으로 대체하여 progressBar를 동기화하십시오. 이렇게하면 Qt가 앱을 업데이트 할 수있는 시간에 이벤트 루프에 들어갈 수 있습니다. 호출 된 프로세스가 stdout에 적당한 것을 출력하면 QProcess :: readyReadStandardOutput() 신호를 사용하는 것을 고려하십시오. 어쩌면 당신의 프로세스는 무언가를합니다. 즉, 크기를 사용하여 진행 상황을 나타낼 수있는 버퍼를 채우거나 단순히 stdout으로 카운트를 출력합니다. 내가 여기 스케치 보자
.. Somewhere in your my_app constructor ...
.. ui->progressBar->setRange(0, 100); ..
.. connect(this, SIGNAL(processProgressSignal(int)), this, SLOT(progressSlot(int)); ..
.. connect(&process, SIGNAL(readyReadStandardError()), this, SLOT(processProgress())); ..
Q_SIGNALS:
void processProgressSignal(int val);
Q_SLOTS:
void my_app::processProgress()
{
int val = 1;
// Insert your process progress calculation here
// Example: Parse the result of QByteArray QProcess::readAllStandardOutput()
// Example: val = (buffer.currLength/buffer.maxLength) * 100;
Q_EMIT processProgressSignal(val);
}
void my_app::progressSlot(int val)
{
if(val < ui->progressBar->maximum())
ui->progressBar->setValue(val++);
}
을 그 문제가 해결되지 않으면 확인하십시오 process.state을() 100 회 "참"- 루프의 100 반복을 허용 할 수 있습니다. qDebug()는 당신의 친구입니다!
행운을 빌어 요!
process.state()에서 무슨 일이 일어나는 지 알 수 있다면 도움이 될 것입니다. –
좋아요. 문제는 process.state() 내부에 있어야합니다. –