QTimer для анимации в qt

Я бы хотел, чтобы paintEvent () вызывался 60 раз в секунду для перемещения нескольких объектов внутри небольших виджетов. Виджет аналогичен вкладке браузера Chrome: когда вы перетаскиваете вкладку далеко от ее положения, она перемещается назад, снижая скорость по мере приближения к ее месту.

Я использую QTimer, подключенный к слоту, где я пересчитываю некоторые геометрические параметры, а затем вызываю update (), чтобы сделать основной цикл вызова qt paintEvent (), где я рисую некоторые линии и QPixmaps.

Но два объекта QTimer, настроенные на интервал 1/60 с, потребляют 10% процессорного времени «Core i5 2500K». Разве это не слишком много процессорного времени для 2 таймеров с 60 тактами в секунду каждый? Ситуация с процессорным временем такая же, если я удаляю весь код из слота (), к которому подключен QTimer (кроме оператора return;).

2

Решение

Обычно для анимации вы позволяете Qt выяснить подходящее время. Есть ли особая причина, чтобы запустить его так быстро? Если вы используете QPropertyAnimation, вы можете получить довольно приятные результаты с плавной анимацией. EasingCurveЭто также может дать вам несколько отличных эффектов.

http://qt.apidoc.info/4.8.5/animation-animatedtiles.html

РЕДАКТИРОВАТЬ: Также звонит update 60x в секунду не обязательно перерисовывать его 60 раз в секунду; вместо этого вы помещаете запросы на перерисовку в цикл обработки событий 60 раз в секунду. В зависимости от того, сколько времени получает Qt и частота обновления видеокарты, а что нет, если основной цикл событий графического интерфейса вашей программы может дойти только до перерисовки вашей графики в 20-35 раз в секунду, кратное update звонки игнорируются. Если вы требуете 60x в секунду, вы будете использовать repaint(), Но в большинстве случаев вам следует позвонить update,

http://qt-project.org/doc/qt-4.8/qwidget.html#update

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

3

Другие решения

Подождите, я думаю, что-то не так с дизайном. Можете ли вы объяснить, чего вы на самом деле пытаетесь достичь? Либо «перетащите» некоторый контент виджета и переместите его обратно на mouseRelease (например), либо попытайтесь перетащить, скажем, страницу из виджета со вкладкой, а также медленно переместить его назад?

Я спрашиваю, потому что, если вам нужно переместить виджет, вам не нужно вызывать paintEvent 60 раз в секунду, вам нужно обойти виджет геометрия и положение, конечно, не вызывайте update () самостоятельно, ИЛИ если вы говорите о содержимом виджета, то вам следует обратить внимание на подкласс QGraphicsEffect.

0

По вопросам рекламы [email protected]