Плавная текстовая анимация (текстовый эффект Marquee) с использованием QT

StackOverflow https://stackoverflow.com/questions/1652590

  •  22-07-2019
  •  | 
  •  

Вопрос

У меня есть вопрос о том, как сделать текст выделенного текста гладким (используя Qt 4.5.3) на не мощном оборудовании (Atom N270 + Intel 945GSM). Мой подход заключается в следующем:

<Ол>
  • Я рисую свой текст (36px Arial bold) на QPixmap (внеэкранное устройство рисования)
  • Я установил таймер для сдвига контента в 1 пиксель влево каждые 30 мс.
  • Когда запускается событие onTimer, я выбираю QPixmap и печатаю эту часть на холсте окна.
  • Вообще говоря, он движется плавно. Однако чем больше текста я создаю, тем больше загружается ЦП. Когда текст может заполнить 50% экрана (1920x1680), загрузка процессора составляет около 70-80%. Текстовая анимация становится немного мерцающей. Если я установлю интервал таймера на 50 мс или больше, он будет плавным. Но текст движется слишком медленно.

    Мой подход неэффективен? Должен ли я использовать OpenGL? Любая подсказка приветствуется и заранее спасибо ^^)

    Это было полезно?

    Решение

    Вы должны заглянуть в каркас графического представления. Вы можете добавить объекты QGraphicsTextItem в QGraphicsScene и установить координаты вида (масштабирование и перемещение), чтобы ваш текст двигался и отображался в любом размере, в том числе с некоторым текстом, который будет «за кадром»; (вне поля зрения). Я ожидал бы, что это будет намного эффективнее, чем копирование и рисование части (изменяющегося размера) QPixmap при каждом событии таймера.

    В документации говорится, что каркас графического представления оптимизирован для одновременной обработки множества объектов. Если это окажется не лучше, вы можете попробовать 4.6 бета. Существуют оптимизации для рендеринга графического представления.

    Кроме того, я бы посмотрел на QTimeLine, чтобы помочь вам управлять анимацией. Помимо предоставления основных «галочек» время от времени вы можете устанавливать «кривые формы»; это может начинаться медленно и ускоряться или замедляться по мере приближения конца. Просто имейте в виду, что если вы хотите перезапустить QTimeLine после сигнала завершения (), если вы измените продолжительность и вызовите start () без вызова setCurrentTime (0), таймер запустится со старой продолжительностью в качестве текущего времени.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top