2010-08-16 4 views
3

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

MainClass :: MainClass() {

ProgressDialog-> Exec();

x->add(); 

updateProgressDialog(); 

y->do(); 

updateProgressDialog(); 

zz->bring(); 

updateProgressDialog(); 

}

// х, у, г три различных класса.

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

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

+0

Вы упоминаете, что вы вызываете нить, чтобы сделать выполнение части .. это означает, что х> Добавить(), y> do() и zz-bring() передать в поток и немедленно вернуться? –

ответ

1

Не зная точно, какие расчеты выполняются в ваших потоках, трудно изолировать проблему. Может быть, это может помочь: Keeping the GUI Responsive

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

0

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

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

Это объясняется в изрядном количестве деталей в документации Qt: QProgressDialog