Кнопка отмены диалога прогресса QT не подсвечена - PullRequest
3 голосов
/ 16 августа 2010

У меня есть приложение, которое использует 20 различных классов. Выполнение программы начинается в главном окне. Я начинаю диалог прогресса. Я буду использовать разные классы для разных целей. После каждого вызова функции, выполнение которого переходит к определенному классу и выполняет требуемый и возвращается к классу основного окна, я буду обновлять диалог прогресса. Теперь проблема в том, что диалог прогресса зависает, когда выполнение уходит из класса mainwindow. Кнопка отмены недоступна, поэтому выполнение не может быть остановлено в нужное время.

MainClass :: MainClass () {

ProgressDialog-> Exec ();

x->add();

updateProgressDialog();

y->do();

updateProgressDialog();

zz->bring();

updateProgressDialog();

}

// x, y, z - три разных класса.

Вот как идет исполнение. Как только я введу функцию в основной класс, я начну диалог прогресса. и вызывать функции из разных классов. Функции занимают значительное количество времени. Я вызвал поток, чтобы выполнить часть выполнения, но я не могу отменить ход выполнения diaolog. Я хочу, чтобы выполнение программы было остановлено, как и при нажатии кнопки отмены в диалоговом окне прогресса.

Пожалуйста, дайте мне знать, как избежать этой проблемы. Надеюсь, мне ясно.

Ответы [ 2 ]

1 голос
/ 17 августа 2010

Не зная точно, какие вычисления выполняются в ваших потоках, трудно выделить проблему.Может быть, это может помочь: Сохранение отзывчивости графического интерфейса пользователя

Выдержка из: Выполнение длинных операций (от: Witold Wysota) При длительных вычислениях (независимо от использования сигналов и слотов) вся обработка событий останавливается.В результате графический интерфейс не обновляется, пользовательский ввод не обрабатывается, сетевая активность останавливается и таймеры не запускаются - приложение выглядит как замороженное, и фактически его часть, не связанная с трудоемкой задачей,замороженные.

0 голосов
/ 17 августа 2010

Функции, которые вы вызываете, не обрабатывают цикл событий Qt.Вы используете модальный индикатор выполнения, так как вы вызываете exec ().Это означает, что Qt получает контроль только в тот момент, когда вы обновляете диалог.

Единственный известный мне способ обойти это - это закодировать диалог как немодальный, но вам также придется предоставитьдля обработки цикла событий.

Это объясняется довольно подробно в документах Qt: QProgressDialog

...