Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: quietness от Декабрь 06, 2010, 12:42



Название: выдвигающееся меню
Отправлено: quietness от Декабрь 06, 2010, 12:42
Доброго времени суток, уважаемые!
Помогите, пожалуйста, решить такую проблемку или укажите направление.

В главном окне есть QToolBox, в нем QCommandLinkButton. Все красиво, все работает. Но вот место теряется. Поэтому хочется сделать по-взрослому. Чтобы QToolBox задвигался влево и потом в случае необходимости выдвигался обратно.

Подскажите, пожалуйста, как его задвинуть?


Название: Re: выдвигающееся меню
Отправлено: deaks от Декабрь 06, 2010, 12:55
картинку в студию)


Название: Re: выдвигающееся меню
Отправлено: quietness от Декабрь 06, 2010, 13:11
(http://xmage.ru/thumbs/clipboard2.jpg) (http://xmage.ru/?v=clipboard2.jpg)
сбоку белое - это QTableView, QSqlQueryModel которого временно отключена


Название: Re: выдвигающееся меню
Отправлено: deaks от Декабрь 06, 2010, 13:38
и вам надо, чтобы тулбокс менялся по ширине?


Название: Re: выдвигающееся меню
Отправлено: quietness от Декабрь 06, 2010, 13:46
нет, чтоб он полностью задвигался влево, оставляя маленькое ушко. нажав на которое он бы обратно выдвигался


Название: Re: выдвигающееся меню
Отправлено: GreatSnake от Декабрь 06, 2010, 14:26
А чем QSplitter не подходит?


Название: Re: выдвигающееся меню
Отправлено: quietness от Декабрь 06, 2010, 14:33
у QToolBox размеры фиксированные и изменятся не должны, тем самым исключается возможность ручного изменения размера путем перетаскивания границы мышкой.


Название: Re: выдвигающееся меню
Отправлено: GreatSnake от Декабрь 06, 2010, 15:43
Ну, тогда можно справа от toolbox-a поместить узкую кнопку, по нажатию на которую прятать/показывать toolbox.


Название: Re: выдвигающееся меню
Отправлено: quietness от Декабрь 06, 2010, 16:23
Всем спасибо, задача решена
GreatSnake, именно так и поступила и через цикл плавное вдвигание и выдвигание.


Название: Re: выдвигающееся меню
Отправлено: Drafter от Декабрь 06, 2010, 20:22
Можете копнуть глубже и воспользоваться QPropertyAnimation, чтобы двигать панельку с ускорением-замедлением (или, например, заставить её выпрыгивать как мячик).

что-нибудь вроде:

Код:
        QPropertyAnimation *anim = new QPropertyAnimation(toolBox, "geometry");
        anim->setDuration(200);
        anim->setEasingCurve(QEasingCurve::OutBounce);
        anim->setStartValue(...);
        anim->setEndValue(...);
        anim->start(QAbstractAnimation::DeleteWhenStopped);


Название: Re: выдвигающееся меню
Отправлено: quietness от Декабрь 07, 2010, 08:51
Drafter, спасибо, сейчас попробую


Название: Re: выдвигающееся меню
Отправлено: SABROG от Декабрь 07, 2010, 11:06
Если углубиться в эту тему, то получается, что вариантов реализации как минимум 3:
1. Изменение ширины виджета до 0 для симуляции скрытия
2. Скроллинг (QWidget::scroll()) виджета за область видимости без изменения его ширины
3. Выдвигающийся виджет (опять QWidget::scroll()), который находится поверх всех виджетов

У варианта 1 существенный недостаток - ширину можно уменьшить только до размеров рекомендуемого sizeHint(), к тому же видно как содержимое виджета "сплющивается" и постоянно пересчитывает расположения виджетов внутри скрываемой панели.

У варианта 2 недостатком является то, что вслед за скроллируемой панелью перемещается и другой виджет (QTableView), но при этом его ширина остается прежней из-за чего с правой стороны появляется незанятая, пустая область, которую, по логике, должен был занять QTableView после перепросчета QLayout'ом. Но scroll() не вызывает этого перепросчета, а если его вызвать насильно через layout()->update(), то скроллинг сбрасывается и виджеты занимают свои старые позиции.

Насчет возможности реализации варианта 3 с помощью стандартных средств Qt есть сомнения. Тут нужно как минимум 2 слоя компановщиков: нижний - с виджетами и верхний, который будет растягивать и прилеплять панель к левой стороне виджета.
Такое вообще возможно, например сделать 2 одинаковых QGridLayout'a в каждом из которых будет свой набор виджетов и которые будут работать параллельно друг на друге в порядке Z очереди?

Update:
Надо посмотреть в сторону QStackedLayout, может через него такое замутить получиться.
Update 2:
Мышиные клики не проходят через страницы в режиме StackAll.