Я использую Qt 4.8.
У меня есть большой QGraphicsScene для обновления (для добавления новых объектов QGraphicsObject требуется 3 секунды).
Я хотел бы показать пользователю, что обновление выполняется.
В частности, я подумал о том, чтобы показать колесо загрузки на экране, а затем удалить его, когда закончится обновление.
Проблема в том, что я должен сделать колесо видимым, а затем не видимым в
та же тема обновления сцены. Это потому что:
Не разрешено редактировать графические свойства вне потока графического интерфейса.
Я не могу переместить вычисления в «рабочий поток», так как это связано с графикой.
Это приводит к тому, что колесо вообще не отображается, поскольку при обновлении вида колесо
уже установлено видимым, а затем снова не видимым:
showWheel();
/*... big computation involving graphics ...*/
hideWheel();
/*... here GUI is updated, thus the wheel doesn't show up...*/
Что я могу сделать?
Спасибо
Предположительно у вас есть какое-то событие, запускающее вычисления. Вместо того чтобы использовать его для запуска вычислений, используйте его для запуска scheduleComputation()
слот. scheduleComputation
слот может звонить showWheel()
а затем запланировать doComputation()
слот для конца следующей очереди событий, после которой он вернется. Это позволит запустить цикл обработки событий и показать ваше колесо, а затем выполнить вычисления. Когда вычисления закончены, вы можете позвонить hideWheel()
и вернитесь в цикл событий.
Что-то вроде этого:
void scheduleComputation()
{
computeScheduler = new QTimer(this);
computeScheduler->setInterval(0);
connect(computeScheduler,SIGNAL(timeout()),this,SLOT(doComputation()));
showWheel();
}
void doComputation()
{
//...Computation Here...
hideWheel();
}
Это также хорошая идея, чтобы не блокировать поток пользовательского интерфейса на длительные периоды времени. Это можно сделать, разбив ваш долго работающий код на более мелкие части, которые могут быть запущены таймером.
Через регулярные промежутки времени в «больших вычислениях» вы можете позволить обработчику событий некоторое время работать.