QProgressDialog в режиме занятости не обновляется
У меня есть простой цикл, в котором я выполняю операцию неопределенной длины. Я установил QProgressDialog с диапазоном (0,0), чтобы запустить его неопределенный режим "занято"; на моей платформе это обычно создает индикатор выполнения, ручка которого подпрыгивает вперед и назад. Тем не менее, даже в сокращении до следующего, диалоговое окно появляется, реагирует на кнопку "Отмена", но ручка застывает на месте в конце полосы и не циклически.
QProgressDialog* progressDialog =
new QProgressDialog("My Progress", "Cancel",
0, 0, this);
progressDialog->setAttribute(Qt::WA_DeleteOnClose, true);
progressDialog->setModal(true);
progressDialog->setMinimumDuration(0);
progressDialog->show();
progressDialog->setValue(0);
while (!done)
{
QThread::msleep(200);
QCoreApplication::processEvents();
}
Очевидно, что на самом деле внутри цикла происходит нечто большее, но он ведет себя одинаково с содержанием или без него; то, что осталось выше после комментирования всего остального, ведет себя, как описано. Почему мой индикатор прогресса не отскакивает назад и вперед?
1 ответ
Ваша проблема не в
Вы используете индикатор выполнения и «задание» в одном потоке — потоке графического интерфейса. Под «работой» я подразумеваю все, что находится внутри цикла и что считается эмуляцией «занятого» режима, потому что в реальной ситуации это должно занять много времени. Таким образом, когда поток «занят» во время сна, ваш графический интерфейс не перемещается, как в том же потоке.
Вы должны использовать поток (или QThread) для запуска задания, чтобы графический интерфейс мог работать в потоке графического интерфейса самостоятельно.
Вот пример, скопированный из «всего» вашего кода (или почти), и полоса занятости действительно отображается правильно.
#include <QApplication>
#include <QProgressDialog>
#include <QThread>
void job()
{
bool done =true;
while (!done)
{
QThread::msleep(1000);
QApplication::processEvents();
}
}
int main(int argc, char *argv[])
{
bool done = false;
QApplication a(argc, argv);
QProgressDialog* progressDialog = new QProgressDialog("My Progress", "Cancel",
0, 0, nullptr);
progressDialog->setAttribute(Qt::WA_DeleteOnClose, true);
progressDialog->setModal(true);
progressDialog->setMinimumDuration(0);
progressDialog->show();
progressDialog->setValue(0);
QThread* thread = QThread::create(job);
thread->start();
return a.exec();
}
вот результат занятой полосы (и она перемещается назад и на четвертую, как вы хотели)