Название: Правильная маскировка кнопок сложной формы. Отправлено: Hrundel от Ноябрь 11, 2012, 02:59 Всем привет, работаю над семестровым проектом. Основная цель проекта разработка GUI.
В качестве темы выбран 3D редактор. Разработал дизайн по принципу ArtRange у них выглядит так (http://i47.fastpic.ru/big/2012/1111/2f/d75e4252d08c9888ecdaac24be4f1c2f.jpg) у меня так же (http://i47.fastpic.ru/big/2012/1111/c9/e1f8933265096fe0bfdcbf3300f6f2c9.jpg) Но вот в чем проблема. При over, на их кнопках, у них нет никаких косяков с масками. кнопки лежат рядом друг с другом но не перекрывают друг друга альфа масками. А у меня получается такая фигня, что если я попадаю мышью на альфа маску от другой кнопки в другом ряду, то начинает подсвечиваться не та кнопка на которой находится мышь, а та, в чей альфа канал она попала. То есть вот так: (http://i48.fastpic.ru/big/2012/1111/eb/a6e01f0e7d059f88c036df5f7bcdc9eb.jpg) Если кто-то знает как решить такую проблему подскажите пожалуйста. Название: Re: Правильная маскировка кнопок сложной формы. Отправлено: carrygun от Ноябрь 11, 2012, 08:41 Сделать маску не прямоугольную, а в форме кнопки.
Вообще расскажи подробнее как ты это делал. Название: Re: Правильная маскировка кнопок сложной формы. Отправлено: mutineer от Ноябрь 11, 2012, 12:17 Еще стоит не разделять виджет на отдельные кнопки, и самому обрабатывать события мыши
Название: Re: Правильная маскировка кнопок сложной формы. Отправлено: Hrundel от Ноябрь 11, 2012, 14:27 Сделать маску не прямоугольную, а в форме кнопки. Вообще расскажи подробнее как ты это делал. Да маски и не прямоугольные совсем, иначе картинки бы перекрывали друг друга. Еще стоит не разделять виджет на отдельные кнопки, и самому обрабатывать события мыши mutineer, А вот это интересно, что значит не разделять виджет на отдельные кнопки? У меня они как раз отдельными кнопками выполнены. А как по другому? Укажи хотя бы направление ты имеешь ввиду, что можно просто ловить координаты в виджете и обрабатывать клик по координатам и туда уже картинку показывать где клик или over был? правильно я понял? Правда такие извращенные координаты будут очень сильно парить. Название: Re: Правильная маскировка кнопок сложной формы. Отправлено: Bepec от Ноябрь 11, 2012, 15:02 Немного геометрии и... Не будут парить.
mutineer предлагает самому отрисовывать кнопки и реакцию на них в коде определять :) Название: Re: Правильная маскировка кнопок сложной формы. Отправлено: Hrundel от Ноябрь 11, 2012, 17:27 Дык я вроде так и сделал:
создал класс на базе QLabel, переписал ему event, получилась кнопка потом создал свое окно, дал ему флаг Qt::Widget чтобы оно типа панели висело. Накидал в окно этих кнопок и реакцию на них конечно тоже переопределил, или подразумевается что-то другое. С геометрией конечно идея вроде очень даже не плохая. Но займет очень много времени. (по крайней мере у меня) А надо все быстро делать. Есть ли способ быстрее и проще решить подобную проблему? Хотя, полагаю, что навряд ли. Название: Re: Правильная маскировка кнопок сложной формы. Отправлено: Bepec от Ноябрь 11, 2012, 18:21 Самому - значит самому.
Берём виджет 1 штука. Берём переопределяем ему paintEvent. Отрисовываем кнопочки. Далее ловим нажатия/наведения мыши. По формуле расчитываем куда тыкает мыша и производим необходимое действие. Как то подсветить или нажать. Отдебажить. Оттестировать. Поставить на панель => Профит. Название: Re: Правильная маскировка кнопок сложной формы. Отправлено: gil9red от Ноябрь 11, 2012, 20:20 Я как то давно писал игрушку судоку (незакончил правда, надоело :)), вот в ней как раз поле рисуется через paintEvent, и присутствует подсчет куда пользователь "тыкнул" мышкой в mouseReleaseEvent, и соответствующее на это действие, маштабирование поля игры тоже идет в рассчет
Может вам, Hrundel, это пригодится :) Название: Re: Правильная маскировка кнопок сложной формы. Отправлено: Hrundel от Ноябрь 11, 2012, 22:46 gil9red, огромное спасибо. Наверняка пригодиться. Приятно встретить отзывчивого человека.
Кстати, мне понравилось исполнение. Название: Re: Правильная маскировка кнопок сложной формы. Отправлено: Hrundel от Ноябрь 11, 2012, 23:22 Спасибо, всем джедаям, гуру и самоварам ;)
Смысл понял, остается только воплощать. Bepec, спасибо. Название: Re: Правильная маскировка кнопок сложной формы. Отправлено: lighting от Ноябрь 12, 2012, 10:33 этот путь может быть не самым простым, если реализовывать кнопки полностью, как-то смена фокуса нажатием Tab, стили, hover и т.п. события. На этом форуме была темка, разрабатывался свой виджет наподобие файерфоксовского обновления плагинов, а на хабре после была выложена статья с обсуждением этого виджета, там в комментариях эти вещи подробно рассматривали.
Хотя если требования не очень жесткие, то это возможно самый удобный и простой вариант. Название: Re: Правильная маскировка кнопок сложной формы. Отправлено: Igors от Ноябрь 12, 2012, 12:36 Виджет заточен на прямоугольник, поэтому если "по кругу", то каждая кнопка виджет - больше неудобств чем выгоды. Рисовать да, можно прямоугольники, маска-сектор. Определить клик на сектор - ну десяток строк кода, Пантер недавно пыхтел :) Не пойму почему геометрия 6-7 класса средней школы вызывает такую панику "ах, это займет очень много времени"
Название: Re: Правильная маскировка кнопок сложной формы. Отправлено: Hrundel от Ноябрь 12, 2012, 13:14 А может еще проще сделать. Ловить на event альфа-маску, если поймал передавать event тому кто снизу.
Правда я пока не знаю будет ли оправдано использовать такие функции ради тупых кнопок. Igors, :) с геометрией-то конечно все в порядке, уже почти дописал, но лично у меня всегда такой лом сочинять математические алгоритмы. Название: Re: Правильная маскировка кнопок сложной формы. Отправлено: Igors от Ноябрь 12, 2012, 13:26 А может еще проще сделать. Ловить на event альфа-маску, если поймал передавать event тому кто снизу. А как Вы узнаете кто/какой снизу? ..с геометрией-то конечно все в порядке, Ну тогда хорошо (а то я хотел уж Вам пример кода набросать :))Название: Re: Правильная маскировка кнопок сложной формы. Отправлено: GreatSnake от Ноябрь 12, 2012, 14:01 Igors, :) с геометрией-то конечно все в порядке, уже почти дописал, но лично у меня всегда такой лом сочинять математические алгоритмы. Коли с геометрией всё в порядке, почему нельзя задействовать QGraphicsPathItem или QGraphicsPolygonItem ???Название: Re: Правильная маскировка кнопок сложной формы. Отправлено: Hrundel от Ноябрь 12, 2012, 20:01 Коли с геометрией всё в порядке, почему нельзя задействовать QGraphicsPathItem или QGraphicsPolygonItem ??? Честно сказать Qt начал два месяца назад и до данного момента о QGraphicsPathItem и QGraphicsPolygonItem ничего не слышал. :) Однако, большое спасибо за подсказку. Посмотрю обязательно. С алгоритмом пока плохо получается, но я бьюсь. Посмотрел QGraphicsPathItem и QGraphicsPolygonItem и мне показалось что с отслеживанием координат значительно проще. Название: Re: Правильная маскировка кнопок сложной формы. Отправлено: Hrundel от Ноябрь 21, 2012, 22:50 Еще только одна деталь.
не стоит использовать виджеты унаследованные от QLabel, лучше всего от QWidget не будет проблем с альфой. А так вообще всё работает |