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

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

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

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

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

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

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

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

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

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

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

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

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

Вот картинки, иллюстрирующие мою проблему:

Перед анимацией После анимации

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


person TaiZzZ    schedule 28.06.2017    source источник
comment
Что вы имеете в виду, говоря, что остается окрашенным во время движения? Также обратите внимание, что ваш репозиторий на github кажется неполным — я получаю ПРЕДУПРЕЖДЕНИЕ: Ошибка поиска: mainwindow.ui, когда я запускаю qmake.   -  person G.M.    schedule 28.06.2017
comment
На самом деле я забыл этот файл, теперь он должен работать правильно. остается окрашенным во время движения не очень ясно, но я не знаю, как кратко объяснить проблему! Может быть, лучший вариант - это иметь фотографии, поэтому, пожалуйста, обращайтесь к картинкам.   -  person TaiZzZ    schedule 28.06.2017


Ответы (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());
person G.M.    schedule 29.06.2017