Как сделать модальный QProgressDialog в QT? - PullRequest
0 голосов
/ 25 октября 2018

Я вызываю 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 Ответ

0 голосов
/ 25 октября 2018

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

http://doc.qt.io/qt-5/thread-basics.html#gui-thread-and-worker-thread

Поток GUI и рабочий поток

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

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

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

http://doc.qt.io/qt-5/qt.html#WindowModality-enum

...