Как сделать модальный QProgressDialog в QT?
Я вызываю QProgressDialog из потока и не могу сделать его модальным окном, даже если для setModal установлено значение true. Я хочу, чтобы основное окно было заблокировано, когда QProgressDialog в действии.
ниже мой кусок кода.
GenericFunc.hQProgressDialog *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
не имеет родителя, поэтому он не будет блокировать цепочку родительских окон.