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();
}

вот результат занятой полосы (и она перемещается назад и на четвертую, как вы хотели)

Другие вопросы по тегам