Russian Qt Forum
Ноябрь 01, 2024, 22:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Выдвигающаяся панель. Вопрос по реализации.  (Прочитано 7403 раз)
SABROG
Гость
« : Декабрь 11, 2010, 11:51 »

Навеяно этой темой.

Это то, как она должна работать в принципе (за исключением того, что не реализован Hover Mouse).


Тут я написал свой layout, благодаря чему высота панели принимает высоту виджета на котором находится.


В качестве реализация скрытия панели был выбран сдвиг за область видимости виджета. В будущем хотелось бы её полностью скрывать при завершении анимации. Вариант через уменьшения ширины панели до нуля меня не устраивает т.к. имеет свои недостатки связанные с пользовательским компановщиком на виджете. Такие вещи как появление трех точек в конце текста на виджетах, препятствование изменению размера виджета по достижению минимального размера и постоянный перепросчет компановщика - нафиг не надо.

В итоге есть такая проблема:


Если менять размеры виджета, который содержит панель, во время анимации, то собственный компановщик перестает его растягивать по высоте родителя и соответственно он пытается достигнуть координат, которые его уже могут и не скрывать.

Стало быть нужно как-то корректировать анимацию в динамике. Я предположил вариант, когда можно остановить QPropertyAnimation, запустить его с новым EndValue и вычесть уже прошедшее время до вызова перепросчета компановщика, получив его через метод currentTime(). Затем нужно скорректировать поведение Easing Curve. Значит надо получить предыдущий через метод QVariantAnimation::easingCurve() и подставить в новую анимацию, чтобы сохранился прогресс интерполяции. Возможно еще что-то придется сделать. Всё это похоже на костыли.

Даже если брать пример троллей $QTDIR/examples/animation/states, то их выплывающий QGroupBox - "Options" точно также глючит во время изменения размеров виджета.

Что думаете по этому поводу?

---
Update:
Цитировать
Стало быть нужно как-то корректировать анимацию в динамике.
Хмм,  оказывается setEndValue() можно выставлять во время анимации без перезапуска.
« Последнее редактирование: Декабрь 11, 2010, 13:29 от SABROG » Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #1 : Декабрь 12, 2010, 01:28 »

Что думаете по этому поводу?
думаю тебе надо "задвигаемый" виджет скрывать, а на его место втыкать пустой виджет с картинкой с задвигаемого. и этот виджет с картинкой задвигать.
и никакого гемора с лайотами.
Сам нарывался на такой глюк но пока не решал.

Посмотри
http://www.viksoe.dk/code/fancyui.htm
нечто подобное?
« Последнее редактирование: Декабрь 12, 2010, 01:31 от panAlexey » Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
SABROG
Гость
« Ответ #2 : Декабрь 12, 2010, 10:59 »

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

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

Сообщений: 976



Просмотр профиля
« Ответ #3 : Декабрь 12, 2010, 17:53 »

Пытался делать нечто подобное, только с popup виджетом, "выезжающим" из кнопки. Столкнулся с теми же проблемами. Ситуация усложнялась тем, что "прятать" виджет было некуда. В итоге решил использовать плавное проявление через изменение прозрачности окна.
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #4 : Декабрь 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)
{
« Последнее редактирование: Декабрь 12, 2010, 19:41 от panAlexey » Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
SABROG
Гость
« Ответ #5 : Декабрь 13, 2010, 13:10 »

Посмотрел, что делает Qt при выдвигающейся анимации QComboBox.


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


Страница сгенерирована за 0.051 секунд. Запросов: 23.