Как сделать модальный QProgressDialog в QT?

Я вызываю QProgressDialog из потока и не могу сделать его модальным окном, даже если для setModal установлено значение true. Я хочу, чтобы основное окно было заблокировано, когда QProgressDialog в действии.

ниже мой кусок кода.

GenericFunc.h
QProgressDialog *progressBarDialog;

GenericFunc.cpp

     void GenericFunc::testSlot()
    {
        int numTasks = 4500;
        progressBarDialog = new QProgressDialog("Task in progress.", "Cancel", 0, numTasks);
        progressBarDialog->setWindowModality(Qt::WindowModal);
        progressBarDialog->setModal(true);
        progressBarDialog->exec();
    }

1 ответ

Решение

Класс QProgressDialog является классом GUI. Вы не можете создать экземпляр этого в рабочем потоке.

http://doc.qt.io/qt-5/thread-basics.html

Нить GUI и рабочая нить

Как уже упоминалось, каждая программа имеет один поток при запуске. Этот поток называется "основным потоком" (также известным как "поток GUI" в приложениях Qt). Графический интерфейс Qt должен работать в этом потоке. Все виджеты и несколько связанных классов, например, QPixmap, не работают во вторичных потоках. Вторичный поток обычно называют "рабочим потоком", потому что он используется для выгрузки обработки обработки из основного потока.

Используйте сигнальные слоты для передачи данных о ходе выполнения из рабочего потока в поток графического интерфейса.

Другая проблема заключается в том, что вы устанавливаете это в WindowModal, но это progressBarDialog не имеет родителя, поэтому он не будет блокировать цепочку родительских окон.

http://doc.qt.io/qt-5/qt.html

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