2012-04-15 2 views
0

저는 Qt의 초보자이며 응용 프로그램 GUI에 프로세스 바를 표시하려고합니다. 다음 코드를 작성했습니다QProgressBar가 98 %에 매달려 있습니다

void my_app::progress() 
{ 
    int val=1; 
    while(process.state()!=0) 
    { 
    ui->progressBar->setValue(val++); 
    } 
    ui->progressBar->setValue(100); 
} 

그러나 진행률 표시 줄은 98 %로 매달려 있습니다. 아무도 나에게 몇 가지 해결책을 제안 할 수 있습니다.
감사합니다.

+1

process.state()에서 무슨 일이 일어나는 지 알 수 있다면 도움이 될 것입니다. –

+1

좋아요. 문제는 process.state() 내부에 있어야합니다. –

답변

2

가능한 두 가지 포인트 : 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()는 당신의 친구입니다!

행운을 빌어 요!

관련 문제