2010-10-02 2 views
0

Я создаю приложение, в котором я использую цикл внутри paintevent, чтобы нарисовать четыре прямоугольника. И я хочу, чтобы каждый прямоугольник был нарисован после 500 мс. Для этого я применяю msleep(). но используя это при каждом запуске приложения, он вешает трубку в течение 2000 мс, а затем рисует все прямоугольники в одно и то же время. Скажите, кто-нибудь скажет мне решение этой проблемы, чтобы каждый прямоугольник рисовался после задержки. Спасибо.Qt: как использовать sleep() с paintEvent

ответ

5

Не используйте sleep/msleep в paintEvent(). Вы хотите быстро обрабатывать события и не тратьте 2 секунды на вызов функции. Нить не может обрабатывать какие-либо другие события, пока работает код обработки событий.

В простом случае вы можете использовать QTimer для приема сигналов четыре раза каждые 500 мс. В слоте обработки обновите переменную-член, чтобы указать, сколько прямоугольников нужно рисовать, и вызовите update() на виджет. Затем в виджетах paintEvent() проверьте переменную-член, нарисуйте прямоугольники и верните их как можно скорее.

(Для более сложных потребностей анимации, посмотрите на QTimeLine.)

+0

Пожалуйста, вы можете предоставить мне Как сделать это для моего кода? – CuriousCase

+0

как ожидание рисовать четыре события рисования прямоугольников также делают другие вещи, и мне нужна задержка только тогда, когда прямоугольники рисуются. Так что я не могу вызывать обновление много раз. Я не знаю, как использовать QTimer. – CuriousCase

0

Я не знаю qt, но я думаю, что ответ кроется в использовании таймера.

0

Попробуйте вместо сна это может помочь

QTimer *t= new QTimer(); 
    t->setSingleShot(true); 
    t->start(60000);//this is the time to sleep in this case 60 seconds 
    QEventLoop pause; 
    connect(t, SIGNAL(timeout()), &pause, SLOT(quit())); 
    pause.exec();//keeps the program responsive 

Refer думаю ссылка QEventLoop

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