Нужны идеи как реализовать поведение собственного виджета |
Здравствуйте, гость ( Вход | Регистрация )
Нужны идеи как реализовать поведение собственного виджета |
SABROG |
15.4.2010, 8:52
Сообщение
#1
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Собственный виджет является контейнером для других виджетов. В собственном виджете нужно ловить все движения мышки, в том числе те, которые происходят над детьми. Если курсор мышки оказывается в определенной клиенсткой позиции, предположим в угле виджета, то нужно "снять" последнее изображение, которое содержит собственный виджет (grabWidget(), render() и т.п.), затем убрать/спрятать все дочерние виджеты, отрисовать в paintEvent'e сохранённое изображение. Когда курсор мышки покинет "зону интересов", то все дочерние виджеты снова показать на экране.
В итоге поведение должно выглядеть следующим образом. Двигаем указатель мышки в угол виджета, если там находится какая-нибудь кнопка-ребенок, то клик по ней не отрабатывается, вместо этого поверх ребенка (а точнее поверх скриншота) рисуется своя кнопка, нажатие по которой и обрабатывается собственным виджетом. При покидании "зоны интересов" всё возвращается обратно. Чтобы была возможность работать с дочерней кнопкой находящейся в "зоне интересов" можно выставить паузу. Но реальная цель - сделать анимацию, а не всплывающие кнопки. |
|
|
igor_bogomolov |
15.4.2010, 9:19
Сообщение
#2
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
нужно "снять" последнее изображение, которое содержит собственный виджет (grabWidget(), render() и т.п.), затем убрать/спрятать все дочерние виджеты, отрисовать в paintEvent'e сохранённое изображение. Когда курсор мышки покинет "зону интересов", то все дочерние виджеты снова показать на экране. Можно воспользоваться QStacketWidget'ом. Т.е. сграбил виджет, отрисовал его в фоне, после чего переключаешь слой. Когда курсор мышки покинет "зону интересов", переключаешь слой обратно. Главное чтобы не было заметно разницы м/у реальным отображением и сграбленным.Дальше ничего не понял. Не смог визуально представить, что ты хочешь получить. Можешь попроще как то разъяснить задачу, какова цель? |
|
|
SABROG |
15.4.2010, 9:27
Сообщение
#3
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Ок, попробую объяснить на примере QStackedWidget. Отводим курсор к правой стороне QStackedWidget'a, под ним рисуется стрелочка типа "Next page", нажимаем на стрелочку, происходит, предположим, эффект растворения одной страницы QStackedWidget'a в другой странице (на ту, куда переключаемся). То есть при определенных условиях нужно применять эффекты или анимацию к текущему изображению страницы (виджета), при этом эффект зависит от расположения мышки и от того где она кликает. Или другой эффект, через перетаскивание. Зажал мышку с правой стороны виджета и перетащил всё изображение справа налево таким образом, чтобы изображение "ехало" (scroll) и за ним появлялось изображение следующего виджета (страницы). То есть как в iphon'e.
|
|
|
igor_bogomolov |
15.4.2010, 11:03
Сообщение
#4
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
Не могу сказать чего то конкретного. Не делал пока таких вещей. Тут нужно пробовать, экспериментировать. Можно попробовать это реализовать на графической сцене, это упростит работу с анимацией и графическими эффектами.
Есть интересное видео, найти бы исходнички |
|
|
SABROG |
15.4.2010, 11:11
Сообщение
#5
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Есть интересное видео, найти бы исходнички Это же ролик из недавнего поста в блоге, там ссылка есть: http://gitorious.org/qt-components Но я бы не хотел прибегать к графической сцене или к QML. Наследование от QGraphicsEffect упростило бы мне задачу, но он глюкавый. |
|
|
Litkevich Yuriy |
15.4.2010, 11:39
Сообщение
#6
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
SABROG, а что если просто наложить виджет, который будет анимацией заниматься, поверх имеющегося (т.е. просто по нужным координатам и без компоновщика)?
|
|
|
SABROG |
15.4.2010, 12:10
Сообщение
#7
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
SABROG, а что если просто наложить виджет, который будет анимацией заниматься, поверх имеющегося (т.е. просто по нужным координатам и без компоновщика)? Я думал об этом. По идее это должен быть "сестринский" (sibling) виджет для детей, но которому придется делать постоянно QWidget::rise()/lower(). По сути это тоже самое, что добавить дополнительный - "особый" виджет в QStackedWidget как страницу и переключаться на него в нужный момент. При этом сделать проверку, если идет попытка переключения страницы на этот "особый" виджет, то делать переключение на самую первую страницу, минуя этот виджет. Предположим я сделаю это, как тогда решить проблемы с отловом событий мыши на дочерних виджетах, которые поместит пользователь. Единственный вариант, который я знаю - в рекурсивном цикле ставить event filter на каждый виджет через installEventFilter. Как-то это не правильно, может есть мысли как это можно сделать иначе? |
|
|
Litkevich Yuriy |
15.4.2010, 12:14
Сообщение
#8
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Я никак не могу найти пример с которым я развлекался. Это переделка:
examples\dialogs\configdialog там при переключении страниц, страницы появлялись плавно, но я сделал, чтобы виджет наложенный на страницу был прозрачен для событий мишки. Если найду, то выложу. |
|
|
AD |
15.4.2010, 12:15
Сообщение
#9
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
А я на словах все не могу понять, чего хотят добиться. Можно хоть какой-то рисунок что-ли или хотя бы близкий аналог? Просто заинтересовала тема, а врубиться что хотят сделать - не могу!
|
|
|
SABROG |
15.4.2010, 12:38
Сообщение
#10
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
чтобы виджет наложенный на страницу был прозрачен для событий мишки Я думал про аттрибут Qt::WA_TransparentForMouseEvents. Но, что насчет клавиатуры? А я на словах все не могу понять, чего хотят добиться. Можно хоть какой-то рисунок что-ли или хотя бы близкий аналог? Просто заинтересовала тема, а врубиться что хотят сделать - не могу! Предположим, что один цветок это одна страничка, а второй - вторая в QStackedWidget/QStackedLayout/QTabWidget Тут какбы сдвиг одной страницы в другую заснят на середине перетаскивания мыши. |
|
|
Текстовая версия | Сейчас: 19.4.2024, 14:47 |