Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Hrundel от Ноябрь 11, 2012, 02:59



Название: Правильная маскировка кнопок сложной формы.
Отправлено: 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 не будет проблем с альфой.

А так вообще всё работает