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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: выдвигающееся меню  (Прочитано 9689 раз)
quietness
Гость
« : Декабрь 06, 2010, 12:42 »

Доброго времени суток, уважаемые!
Помогите, пожалуйста, решить такую проблемку или укажите направление.

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

Подскажите, пожалуйста, как его задвинуть?
Записан
deaks
Гость
« Ответ #1 : Декабрь 06, 2010, 12:55 »

картинку в студию)
Записан
quietness
Гость
« Ответ #2 : Декабрь 06, 2010, 13:11 »


сбоку белое - это QTableView, QSqlQueryModel которого временно отключена
Записан
deaks
Гость
« Ответ #3 : Декабрь 06, 2010, 13:38 »

и вам надо, чтобы тулбокс менялся по ширине?
Записан
quietness
Гость
« Ответ #4 : Декабрь 06, 2010, 13:46 »

нет, чтоб он полностью задвигался влево, оставляя маленькое ушко. нажав на которое он бы обратно выдвигался
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Декабрь 06, 2010, 14:26 »

А чем QSplitter не подходит?
Записан

Qt 5.11/4.8.7 (X11/Win)
quietness
Гость
« Ответ #6 : Декабрь 06, 2010, 14:33 »

у QToolBox размеры фиксированные и изменятся не должны, тем самым исключается возможность ручного изменения размера путем перетаскивания границы мышкой.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Декабрь 06, 2010, 15:43 »

Ну, тогда можно справа от toolbox-a поместить узкую кнопку, по нажатию на которую прятать/показывать toolbox.
Записан

Qt 5.11/4.8.7 (X11/Win)
quietness
Гость
« Ответ #8 : Декабрь 06, 2010, 16:23 »

Всем спасибо, задача решена
GreatSnake, именно так и поступила и через цикл плавное вдвигание и выдвигание.
Записан
Drafter
Гость
« Ответ #9 : Декабрь 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);
« Последнее редактирование: Декабрь 06, 2010, 20:26 от Drafter » Записан
quietness
Гость
« Ответ #10 : Декабрь 07, 2010, 08:51 »

Drafter, спасибо, сейчас попробую
Записан
SABROG
Гость
« Ответ #11 : Декабрь 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.
« Последнее редактирование: Декабрь 07, 2010, 11:29 от SABROG » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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