Название: Выдвигающаяся панель. Вопрос по реализации. Отправлено: SABROG от Декабрь 11, 2010, 11:51 Навеяно этой (http://www.prog.org.ru/topic_15961_0.html) темой.
Это то, как она должна работать в принципе (за исключением того, что не реализован Hover Mouse). (http://img138.imageshack.us/img138/5692/slidepanel1.gif) Тут я написал свой layout, благодаря чему высота панели принимает высоту виджета на котором находится. (http://img151.imageshack.us/img151/5075/slidepanel2.gif) В качестве реализация скрытия панели был выбран сдвиг за область видимости виджета. В будущем хотелось бы её полностью скрывать при завершении анимации. Вариант через уменьшения ширины панели до нуля меня не устраивает т.к. имеет свои недостатки связанные с пользовательским компановщиком на виджете. Такие вещи как появление трех точек в конце текста на виджетах, препятствование изменению размера виджета по достижению минимального размера и постоянный перепросчет компановщика - нафиг не надо. В итоге есть такая проблема: (http://img12.imageshack.us/img12/970/slidepanel3.gif) Если менять размеры виджета, который содержит панель, во время анимации, то собственный компановщик перестает его растягивать по высоте родителя и соответственно он пытается достигнуть координат, которые его уже могут и не скрывать. Стало быть нужно как-то корректировать анимацию в динамике. Я предположил вариант, когда можно остановить QPropertyAnimation, запустить его с новым EndValue и вычесть уже прошедшее время до вызова перепросчета компановщика, получив его через метод currentTime(). Затем нужно скорректировать поведение Easing Curve. Значит надо получить предыдущий через метод QVariantAnimation::easingCurve() и подставить в новую анимацию, чтобы сохранился прогресс интерполяции. Возможно еще что-то придется сделать. Всё это похоже на костыли. Даже если брать пример троллей $QTDIR/examples/animation/states (http://doc.qt.nokia.com/latest/animation-states.html), то их выплывающий QGroupBox - "Options" точно также глючит во время изменения размеров виджета. Что думаете по этому поводу? --- Update: Цитировать Стало быть нужно как-то корректировать анимацию в динамике. Хмм, оказывается setEndValue() можно выставлять во время анимации без перезапуска.Название: Re: Выдвигающаяся панель. Вопрос по реализации. Отправлено: panAlexey от Декабрь 12, 2010, 01:28 Что думаете по этому поводу? думаю тебе надо "задвигаемый" виджет скрывать, а на его место втыкать пустой виджет с картинкой с задвигаемого. и этот виджет с картинкой задвигать.и никакого гемора с лайотами. Сам нарывался на такой глюк но пока не решал. Посмотри http://www.viksoe.dk/code/fancyui.htm нечто подобное? Название: Re: Выдвигающаяся панель. Вопрос по реализации. Отправлено: SABROG от Декабрь 12, 2010, 10:59 на его место втыкать пустой виджет с картинкой с задвигаемого. и этот виджет с картинкой задвигать. А какая тогда разница, если подменяемый виджет все-равно подчиняется общим законам геометрии? Пусть даже и с картинкой на нем, но он точно также должен будет растягиваться по высоте, а вместе с ним и обновляться геометрия виджетов находящихся на изображении.и никакого гемора с лайотами. Посмотри Нечто подобное это QDockWidget's в QMainWindow, а у меня панель, которая не вытесняет собой центральный виджет, а находится поверх него.http://www.viksoe.dk/code/fancyui.htm нечто подобное? Название: Re: Выдвигающаяся панель. Вопрос по реализации. Отправлено: xokc от Декабрь 12, 2010, 17:53 Пытался делать нечто подобное, только с popup виджетом, "выезжающим" из кнопки. Столкнулся с теми же проблемами. Ситуация усложнялась тем, что "прятать" виджет было некуда. В итоге решил использовать плавное проявление через изменение прозрачности окна.
Название: Re: Выдвигающаяся панель. Вопрос по реализации. Отправлено: panAlexey от Декабрь 12, 2010, 19:38 Пытался делать нечто подобное, только с popup виджетом, "выезжающим" из кнопки. Столкнулся с теми же проблемами. Ситуация усложнялась тем, что "прятать" виджет было некуда. В итоге решил использовать плавное проявление через изменение прозрачности окна. Я собственно в этих целях пользовался вот чем:Код: void uoColorChooser::popupShow() Код: uoColorCContainer* m_Container; Код: class uoColorCContainer : public QFrame Код: uoColorCContainer::uoColorCContainer(uoColorChooser* Chooser) Название: Re: Выдвигающаяся панель. Вопрос по реализации. Отправлено: SABROG от Декабрь 13, 2010, 13:10 Посмотрел, что делает Qt при выдвигающейся анимации QComboBox.
(http://img607.imageshack.us/img607/2531/qtrolleffect.gif) Создается виджет QRollEffect в качестве ребенка для анимируемого виджета. Перекрывает собой всё содержимое и вызывает grabWidget(), чтобы в paintEvent'e рисовать оригинальный контент. Затем тупо move() и resize() по таймеру. Но из-за высокой скорости анимации четко не видно идет коорекция позиции анимации или нет. Но судя по позиции итогового меню этой коррекции нет. |