Навеяно
этой темой.
Это то, как она должна работать в принципе (за исключением того, что не реализован Hover Mouse).
Тут я написал свой layout, благодаря чему высота панели принимает высоту виджета на котором находится.
В качестве реализация скрытия панели был выбран сдвиг за область видимости виджета. В будущем хотелось бы её полностью скрывать при завершении анимации. Вариант через уменьшения ширины панели до нуля меня не устраивает т.к. имеет свои недостатки связанные с пользовательским компановщиком на виджете. Такие вещи как появление трех точек в конце текста на виджетах, препятствование изменению размера виджета по достижению минимального размера и постоянный перепросчет компановщика - нафиг не надо.
В итоге есть такая проблема:
Если менять размеры виджета, который содержит панель, во время анимации, то собственный компановщик перестает его растягивать по высоте родителя и соответственно он пытается достигнуть координат, которые его уже могут и не скрывать.
Стало быть нужно как-то корректировать анимацию в динамике. Я предположил вариант, когда можно остановить QPropertyAnimation, запустить его с новым EndValue и вычесть уже прошедшее время до вызова перепросчета компановщика, получив его через метод currentTime(). Затем нужно скорректировать поведение Easing Curve. Значит надо получить предыдущий через метод QVariantAnimation::easingCurve() и подставить в новую анимацию, чтобы сохранился прогресс интерполяции. Возможно еще что-то придется сделать. Всё это похоже на костыли.
Даже если брать пример троллей
$QTDIR/examples/animation/states, то их выплывающий QGroupBox - "Options" точно также глючит во время изменения размеров виджета.
Что думаете по этому поводу?
---
Update:
Стало быть нужно как-то корректировать анимацию в динамике.
Хмм, оказывается setEndValue() можно выставлять во время анимации без перезапуска.