Где сохранить состояние анимации QWidget для использования в функциях рисования QStyle?

QWidget как paintEvent функция, которая отвечает за его рисунок. Чтобы правильно реализовать эту функцию, QStyle Объект используется для представления каждого компонента и QStyleOption Объект для сохранения статуса элемента управления.

Например: обычай ScrollBar реализовать его paintEvent, который называют drawComplexControl с опцией «CC_ScrollBar«. Затем, QProxyStyle может быть расширен, чтобы изменить внешний вид полосы прокрутки.

Когда пользователь наводит ползунок, paintEvent вызывается, который применяет новый «зависший» вид, состояние которого сохраняется в QStyleOption::state, Но пока что для дневных виджетов это состояние не должно обновляться мгновенно, а с плавным переходом (анимацией) в течение примерно 100-500 миллисекунд. Для анимации виджета с этим переходом необходимы некоторые значения, например, текущее состояние анимации ( qreal/QColor?) для каждой части прокрутки: верхняя стрелка, нижняя стрелка или ползунок.


После этого «длинного» вступления у меня возникает вопрос:

Есть ли где-нибудь переменная для установки состояния этой анимации?? Я мог бы продлить QStyleOption с этим новым значением, но текущая реализация, кажется, уже включает анимацию, я не могу найти, где сохраняется это переходное состояние.

Я ищу канонический ответ.

Примечание: чтобы избежать «возможного дублирования …», даже если оно немного связано, это НЕ вопрос о том, как использовать QAnimation или создавать собственные виджеты.

5

Решение

Анимации стиля получены из частного QStyleAnimation (#include "qstyleanimation_p.h"), и они QAbstractAnimation и поэтому QObject, Например, анимация стиля полосы прокрутки QScrollbarStyleAnimation,

Вот как стиль Windows drawControl получает указатель на анимацию:

if (QProgressStyleAnimation *animation =
qobject_cast<QProgressStyleAnimation*>(d->animation(opt->styleObject)))

Анимации для различных объектов стиля управляются стилем Pimpl-х animation, startAnimation а также stopAnimation методы. Базовый PIMPL, который определяет эти методы: QCommonStylePrivate (#include <private/qcommonstyle_p.h>).

То, как вы будете использовать его в своем собственном стиле, будет следующим:

  1. Извлеките свой стиль из QCommonStyle, используйте идиому PIMPL и получайте ваш pimpl из QCommonStylePrivate, Я задокументировал идиому Qt’s PIMPL чтобы было проще.

  2. Повторно используйте один из существующих классов анимации стиля или используйте свой собственный QStyleAnimation,

  3. Использовать QCommonStyle Методы PIMPL для управления анимацией. Впрочем, сначала вы должны создать экземпляр анимации.

4

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


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