Я вызываю 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();
}
Класс QProgressDialog является классом GUI. Вы не можете создать экземпляр этого в рабочем потоке.
http://doc.qt.io/qt-5/thread-basics.html#gui-thread-and-worker-thread
Нить GUI и рабочая нить
Как уже упоминалось, каждая программа имеет один поток при запуске. это
поток называется «основным потоком» (также известный как «поток GUI» в
Приложения Qt). Графический интерфейс Qt должен работать в этом потоке. Все виджеты и
несколько связанных классов, например QPixmap, не работают во вторичном
потоки. Вторичный поток обычно называют «рабочий»
поток «, потому что он используется для разгрузки обработки работы с основного
нить.
Используйте сигнальные слоты для передачи данных о ходе выполнения из рабочего потока в поток графического интерфейса.
Другая проблема заключается в том, что вы устанавливаете это в WindowModal, но это progressBarDialog
не имеет родителя, поэтому он не будет блокировать цепочку родительских окон.
Других решений пока нет …