Russian Qt Forum

Qt => Общие вопросы => Тема начата: SABROG от Декабрь 11, 2010, 11:51



Название: Выдвигающаяся панель. Вопрос по реализации.
Отправлено: 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
на его место втыкать пустой виджет с картинкой с задвигаемого. и этот виджет с картинкой задвигать.
и никакого гемора с лайотами.
А какая тогда разница, если подменяемый виджет все-равно подчиняется общим законам геометрии? Пусть даже и с картинкой на нем, но он точно также должен будет растягиваться по высоте, а вместе с ним и обновляться геометрия виджетов находящихся на изображении.

Посмотри
http://www.viksoe.dk/code/fancyui.htm
нечто подобное?
Нечто подобное это QDockWidget's в QMainWindow, а у меня панель, которая не вытесняет собой центральный виджет, а находится поверх него.


Название: Re: Выдвигающаяся панель. Вопрос по реализации.
Отправлено: xokc от Декабрь 12, 2010, 17:53
Пытался делать нечто подобное, только с popup виджетом, "выезжающим" из кнопки. Столкнулся с теми же проблемами. Ситуация усложнялась тем, что "прятать" виджет было некуда. В итоге решил использовать плавное проявление через изменение прозрачности окна.


Название: Re: Выдвигающаяся панель. Вопрос по реализации.
Отправлено: panAlexey от Декабрь 12, 2010, 19:38
Пытался делать нечто подобное, только с popup виджетом, "выезжающим" из кнопки. Столкнулся с теми же проблемами. Ситуация усложнялась тем, что "прятать" виджет было некуда. В итоге решил использовать плавное проявление через изменение прозрачности окна.
Я собственно в этих целях пользовался вот чем:
Код:
void uoColorChooser::popupShow()
{
if (m_colorList.isEmpty())
return;
if (m_Container->isVisible()){
popupHide();
return;
}

getContainer();
QSize sz = m_Container->recalcSize();
m_Container->doChangeCurColor(m_colorCurPos);

    QPoint below = mapToGlobal(frameRect().bottomLeft());
    QRect rectScrin = QApplication::desktop()->screenGeometry(QApplication::desktop()->screenNumber(this));
    QRect contRect = QRect(below, QPoint(below.x()+sz.width(), below.y()+sz.height()));

contRect.moveTopLeft(below);
    if (!rectScrin.contains(contRect.bottomRight())){
contRect.translate(0,-(frameRect().height()+contRect.height()));
    }
    m_Container->setGeometry(contRect);
m_Container->raise();
    m_Container->show();
    m_Container->update();
    m_Container->setFocus();
}

Код:
	uoColorCContainer* m_Container;
Код:
class uoColorCContainer : public QFrame
{
Q_OBJECT
Код:
uoColorCContainer::uoColorCContainer(uoColorChooser* Chooser)
:QFrame(Chooser,Qt::Popup) , m_chooser(Chooser)
{


Название: Re: Выдвигающаяся панель. Вопрос по реализации.
Отправлено: SABROG от Декабрь 13, 2010, 13:10
Посмотрел, что делает Qt при выдвигающейся анимации QComboBox.
(http://img607.imageshack.us/img607/2531/qtrolleffect.gif)

Создается виджет QRollEffect в качестве ребенка для анимируемого виджета. Перекрывает собой всё содержимое и вызывает grabWidget(), чтобы в paintEvent'e рисовать оригинальный контент. Затем тупо move() и resize() по таймеру. Но из-за высокой скорости анимации четко не видно идет коорекция позиции анимации или нет. Но судя по позиции итогового меню этой коррекции нет.