как сделать модальный 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();
}

0

Решение

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

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

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

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

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

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

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]