2012-04-15 3 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 «максимум» не равно 100, оно не достигнет 100%. Ваш «вал» также игнорирует максимум «ProgressBar», поэтому необходимо исправить:

if(val < ui->progressBar->maximum()) 
    ui->progressBar->setValue(val++);  

Большинство рабочих мест имеют четкую концепцию прогресса, которая не очевидна здесь. Ваш цикл while может быть слишком быстрым, чтобы визуально распознавать шаги прогресса. Попробуйте подставить цикл while парой сигналов/слотов, чтобы синхронизировать progressBar. Это также позволит Qt периодически вводить цикл событий для обновления вашего приложения. Рассмотрите возможность использования сигнала QProcess :: readyReadStandardOutput(), если вызываемый процесс выдает что-то разумное для stdout. Возможно, ваш процесс что-то делает, т. Е. Заполняет буфер, размер которого вы можете использовать для указания прогресса - или просто выводит счетчик на 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() - ваш друг!

Удачи!

Смежные вопросы