Анимация на объекте QPainterPath

Я хотел бы отобразить анимированную кнопку формы стрелки.

Чтобы нарисовать его, я создал класс, который наследует QGraphicsObject и использовать QPainterPath учебный класс.

Я рисую это в QGraphicsScene и оживить его с помощью свойства geometry переопределено в классе MyArrow.

Вы можете найти весь код здесь: https://github.com/TaiZzZ/arrowAnimation

Моя проблема заключается в следующем:

Стрелка оживляет (это означает, что она движется вправо и возвращается), но остается окрашенной во время движения. У тебя есть идеи почему?

PS: У меня такое же поведение при использовании QState Machine, поэтому я предполагаю, что проблема заключается только в том, как я рисую свои стрелки.

Я пробовал две разные вещи:

  • Изменение кривой Безье в линию не решает проблему.

  • Вместо того, чтобы рисовать путь, я нарисовал прямоугольник (boundingRect()) (Так я только поменял drawPath(path)), и это работает

Итак, в заключение, ошибка исходит от QPainterPath... но почему?

РЕДАКТИРОВАТЬ:

Вот фотографии, чтобы проиллюстрировать мою проблему:

До анимации После анимации

Обратите внимание, что это больше не сглаживает...

1 ответ

Решение

Проблема на самом деле довольно проста - вы не очищаете QPainterPath перед повторным использованием.

Ваш Arrow класс имеет член...

QPainterPath arrow;

и ваш Arrow::paint реализация начинается с...

arrow.moveTo(rect.right(),rect.center().y());
arrow.lineTo(rect.left(),rect.top());

Итак, каждый раз Arrow::paint называется это добавляет еще один новый подпуть к QPainterPath, Следовательно, в любой момент времени вы видите накопленные пути. Самое простое решение было бы удалить arrow переменная-член и использовать локально QPainterPath...

QPainterPath arrow;
arrow.moveTo(rect.right(),rect.center().y());
arrow.lineTo(rect.left(),rect.top());
Другие вопросы по тегам