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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Правильная маскировка кнопок сложной формы.  (Прочитано 11662 раз)
Hrundel
Гость
« : Ноябрь 11, 2012, 02:59 »

Всем привет, работаю над семестровым проектом. Основная цель проекта разработка GUI.
В качестве темы выбран 3D редактор.

Разработал дизайн по принципу ArtRange

у них выглядит так



у меня так же



Но вот в чем проблема. При over, на их кнопках, у них нет никаких косяков с масками.
кнопки лежат рядом друг с другом но не перекрывают друг друга альфа масками.

А у меня получается такая фигня, что если я попадаю мышью на альфа маску от другой кнопки в другом ряду, то начинает подсвечиваться не та кнопка на которой находится мышь, а та, в чей альфа канал она попала.

То есть вот так:



Если кто-то знает как решить такую проблему подскажите пожалуйста.
Записан
carrygun
Гость
« Ответ #1 : Ноябрь 11, 2012, 08:41 »

Сделать маску не прямоугольную, а в форме кнопки.
Вообще расскажи подробнее как ты это делал.
Записан
mutineer
Гость
« Ответ #2 : Ноябрь 11, 2012, 12:17 »

Еще стоит не разделять виджет на отдельные кнопки, и самому обрабатывать события мыши
Записан
Hrundel
Гость
« Ответ #3 : Ноябрь 11, 2012, 14:27 »

Сделать маску не прямоугольную, а в форме кнопки.
Вообще расскажи подробнее как ты это делал.

Да маски и не прямоугольные совсем, иначе картинки бы перекрывали друг друга.

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

mutineer,
А вот это интересно, что значит не разделять виджет на отдельные кнопки? У меня они как раз отдельными кнопками выполнены. А как по другому? Укажи хотя бы направление
ты имеешь ввиду, что можно просто ловить координаты в виджете и обрабатывать клик по координатам и туда уже картинку показывать где клик или over был? правильно я понял?
Правда такие извращенные координаты будут очень сильно парить.
« Последнее редактирование: Ноябрь 11, 2012, 14:55 от Hrundel » Записан
Bepec
Гость
« Ответ #4 : Ноябрь 11, 2012, 15:02 »

Немного геометрии и... Не будут парить.

mutineer предлагает самому отрисовывать кнопки и реакцию на них в коде определять Улыбающийся
Записан
Hrundel
Гость
« Ответ #5 : Ноябрь 11, 2012, 17:27 »

Дык я вроде так и сделал:
создал класс на базе QLabel, переписал ему event, получилась кнопка
потом создал свое окно, дал ему флаг Qt::Widget чтобы оно типа панели висело.
Накидал в окно этих кнопок и реакцию на них конечно тоже переопределил,
или подразумевается что-то другое.

С геометрией конечно идея вроде очень даже не плохая. Но займет очень много времени. (по крайней мере у меня) А надо все быстро делать.

Есть ли способ быстрее и проще решить подобную проблему? Хотя, полагаю, что навряд ли.

Записан
Bepec
Гость
« Ответ #6 : Ноябрь 11, 2012, 18:21 »

Самому - значит самому.

Берём виджет 1 штука. Берём переопределяем ему paintEvent. Отрисовываем кнопочки.

Далее ловим нажатия/наведения мыши. По формуле расчитываем куда тыкает мыша и производим необходимое действие. Как то подсветить или нажать.

Отдебажить. Оттестировать. Поставить на панель => Профит.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #7 : Ноябрь 11, 2012, 20:20 »

Я как то давно писал игрушку судоку (незакончил правда, надоело Улыбающийся), вот в ней как раз поле рисуется через paintEvent, и присутствует подсчет куда пользователь "тыкнул" мышкой в mouseReleaseEvent, и соответствующее на это действие, маштабирование поля игры тоже идет в рассчет
Может вам, Hrundel, это пригодится Улыбающийся
Записан

Hrundel
Гость
« Ответ #8 : Ноябрь 11, 2012, 22:46 »

gil9red, огромное спасибо. Наверняка пригодиться. Приятно встретить отзывчивого человека.

Кстати, мне понравилось исполнение.
« Последнее редактирование: Ноябрь 11, 2012, 23:20 от Hrundel » Записан
Hrundel
Гость
« Ответ #9 : Ноябрь 11, 2012, 23:22 »

Спасибо, всем джедаям, гуру и самоварам Подмигивающий
Смысл понял, остается только воплощать.
Bepec, спасибо.
Записан
lighting
Гость
« Ответ #10 : Ноябрь 12, 2012, 10:33 »

этот путь может быть не самым простым, если реализовывать кнопки полностью, как-то смена фокуса нажатием Tab, стили, hover и т.п. события. На этом форуме была темка, разрабатывался свой виджет наподобие файерфоксовского обновления плагинов, а на хабре после была выложена статья с обсуждением этого виджета, там в комментариях эти вещи подробно рассматривали.
Хотя если требования не очень жесткие, то это возможно самый удобный и простой вариант.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Ноябрь 12, 2012, 12:36 »

Виджет заточен на прямоугольник, поэтому если "по кругу", то каждая кнопка виджет - больше неудобств чем выгоды. Рисовать да, можно прямоугольники, маска-сектор. Определить клик на сектор - ну десяток строк кода, Пантер недавно пыхтел  Улыбающийся Не пойму почему геометрия 6-7 класса средней школы вызывает такую панику "ах, это займет очень много времени"
Записан
Hrundel
Гость
« Ответ #12 : Ноябрь 12, 2012, 13:14 »

А может еще проще сделать. Ловить на event альфа-маску, если поймал передавать event тому кто снизу.
Правда я пока не знаю будет ли оправдано использовать такие функции ради тупых кнопок.

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

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Ноябрь 12, 2012, 13:26 »

А может еще проще сделать. Ловить на event альфа-маску, если поймал передавать event тому кто снизу.
А как Вы узнаете кто/какой снизу?

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

Сообщений: 2921



Просмотр профиля
« Ответ #14 : Ноябрь 12, 2012, 14:01 »

Igors, Улыбающийся с геометрией-то конечно все в порядке, уже почти дописал, но лично у меня всегда такой лом сочинять математические алгоритмы.
Коли с геометрией всё в порядке, почему нельзя задействовать QGraphicsPathItem или QGraphicsPolygonItem  Непонимающий
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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