2013-02-20 4 views
0

Когда программа сначала загружается, иногда требуется обновление компонентов. Задача обновления должна выполняться автоматически, без какого-либо взаимодействия с пользователем.Запустить окно, обработать данные и закрыть его без взаимодействия с пользователем?

Я хочу показать простое окно, которое покажет ход. Когда это будет сделано, окно будет закрыто, и основное окно запустится.

Я попытался использовать QDialog и поместил дорогостоящий код в функцию init, но, конечно же, он просто заблокировал окно, и оно не появилось, пока оно уже не было выполнено.

Нет сигнала, посылаемого при запуске exec(), поэтому я не могу просто начать обрабатывать вещи сразу после выполнения окна графического интерфейса.

QProgressDialog может работать здесь, но я вызывающе хочу поставить там более одного шага прогресса.

Любые идеи?

+0

вы можете использовать QProgressDialog? –

+0

Возможно, хотя это более ограничивает (я хочу немного больше, чем просто прогресс в нем). Я хочу знать, как справиться с этой ситуацией. – iTayb

ответ

2

Есть несколько аплодисментов. Один из них используют QTimer в очередь вашего процесса сразу после начала цикла обработки событий QDialog:

QTimer::singleShot(0, this, SLOT(performUpdate()); 
dlg.exec(); 

главного из Qt документации:

QTimer с тайм-аутом интервалом 0 будет время, как только все события в очереди оконной системы были обработаны.

А что здесь происходит? Мы планируем слот performUpdate(), который будет выполнен, как только управление вернется в цикл событий. При вызове dlg.exec() вы начинаете новый цикл событий. Таким образом, ваш диалог будет показан первым (так как это событие оконной системы), а затем, когда все будет обработано, ваш слот будет выполнен.

Стоит упомянуть, что когда вы выполняете блокирующий слот, вы должны время от времени вызывать QApplication :: processEvents(), чтобы обновить ui.

1

Вы можете использовать любое окно в этом сценарии. Давайте использовать QWidget:

  1. Подкласс QWidget (давайте назовем его MyWidget) и добавить любые виджеты вам нужно, как дети к нему.
  2. Добавьте необходимые слоты в MyWidget, который берет информацию извне (обновляет индикатор выполнения, текстовые метки и т. Д.)
  3. Создайте еще один класс (калькулятор), который будет выполнять вычисления (или что-то еще, что вам нужно сделать) и добавлять необходимые сигналы к ней (пары для слотов вы объявленные ранее) и сигнала для бросить курить

Тогда просто сделать следующее в вашем главном:

QApplication app(...); 
QThread thread; 
MyWidget widget; 
Calculator calculator; 
//connect here your slots and signals, do not forget about quit signal to QWidget close() slot 
calculator.moveToThread(&thread); 
thread.start(); 
return app.exec(); 

 Смежные вопросы

  • Нет связанных вопросов^_^