crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> Нужны идеи как реализовать поведение собственного виджета
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  


Цитата(SABROG @ 15.4.2010, 9:52) *
нужно "снять" последнее изображение, которое содержит собственный виджет (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  


Цитата(igor_bogomolov @ 15.4.2010, 12:03) *
Есть интересное видео, найти бы исходнички


Это же ролик из недавнего поста в блоге, там ссылка есть: http://gitorious.org/qt-components

Но я бы не хотел прибегать к графической сцене или к QML. Наследование от QGraphicsEffect упростило бы мне задачу, но он глюкавый.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.4.2010, 11:39
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9666
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


SABROG, а что если просто наложить виджет, который будет анимацией заниматься, поверх имеющегося (т.е. просто по нужным координатам и без компоновщика)?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 15.4.2010, 12:10
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(Litkevich Yuriy @ 15.4.2010, 12:39) *
SABROG, а что если просто наложить виджет, который будет анимацией заниматься, поверх имеющегося (т.е. просто по нужным координатам и без компоновщика)?

Я думал об этом. По идее это должен быть "сестринский" (sibling) виджет для детей, но которому придется делать постоянно QWidget::rise()/lower(). По сути это тоже самое, что добавить дополнительный - "особый" виджет в QStackedWidget как страницу и переключаться на него в нужный момент. При этом сделать проверку, если идет попытка переключения страницы на этот "особый" виджет, то делать переключение на самую первую страницу, минуя этот виджет. Предположим я сделаю это, как тогда решить проблемы с отловом событий мыши на дочерних виджетах, которые поместит пользователь. Единственный вариант, который я знаю - в рекурсивном цикле ставить event filter на каждый виджет через installEventFilter. Как-то это не правильно, может есть мысли как это можно сделать иначе?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.4.2010, 12:14
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9666
Регистрация: 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  


Цитата(Litkevich Yuriy @ 15.4.2010, 13:14) *
чтобы виджет наложенный на страницу был прозрачен для событий мишки

Я думал про аттрибут Qt::WA_TransparentForMouseEvents. Но, что насчет клавиатуры?

Цитата(AD @ 15.4.2010, 13:15) *
А я на словах все не могу понять, чего хотят добиться. Можно хоть какой-то рисунок что-ли или хотя бы близкий аналог? Просто заинтересовала тема, а врубиться что хотят сделать - не могу!

Предположим, что один цветок это одна страничка, а второй - вторая в QStackedWidget/QStackedLayout/QTabWidget


Тут какбы сдвиг одной страницы в другую заснят на середине перетаскивания мыши.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V   1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.4.2021, 2:04