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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: MouseClickEvent по сложной маске  (Прочитано 4113 раз)
Crazy Sage
Гость
« : Ноябрь 19, 2014, 08:13 »

Добрый день, нужна помощь с обработкой мышиных событий:
Есть дизайн программы, с шестиугольными примыкающими друг к другу кнопками и прочей радостью, которую не очень хочется реализовывать отдельными виджетами. Отслеживать mouseClickEvent по координатам тоже не очень удобно, но уже вариант. Вопрос - можно ли как-то сделать набор масок по которым определять область mouseClick'а? Можно конечно вручную подключать по битмапу на каждую кнопку виджета и брать в цикле цвет с каждой из них или сделать разноцветную картинку и проверять цвет  по координате клика, но может есть какие-то менее порнографичные способы?
Записан
Bepec
Гость
« Ответ #1 : Ноябрь 19, 2014, 09:06 »

На мой взгляд отслеживать по координатам самое простое. Тупо пишете ф-цию принимающую координаты и выдающую номер/идентификатор кнопки. А картинку уже сами рисуете под формулу Улыбающийся Хоть гексаэдры туда вписывайте.
Записан
vulko
Гость
« Ответ #2 : Ноябрь 19, 2014, 09:14 »

кнопка рисуется как картинка или по координатам?

если как картинка, то у неё прозрачный фон. делаешь отдельным виджетом, при клике смотришь локальную позицию мышки (внутри виджета) и проверяешь пиксель по этим координатам на прозрачность.

но это ничем не лучше и не быстрее чем проверка по координатам.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Ноябрь 19, 2014, 10:19 »

Есть дизайн программы, с шестиугольными примыкающими друг к другу кнопками и прочей радостью,
Какой прочей? Определить что точка внутри шестиугольника - детская забава, что там еще? Может просто без масок посчитать да и все?
Записан
Crazy Sage
Гость
« Ответ #4 : Ноябрь 19, 2014, 10:26 »

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

Сообщений: 4349



Просмотр профиля
« Ответ #5 : Ноябрь 19, 2014, 10:31 »

Понял, буду вспоминать курс компьютерной геометрии и графики.
Потому что не нужно было ни разу, вот и не помню нифига.
Вспомнить всегда хорошо, а потом можно посмотреть на QRegion + QPolygon и использовать:
bool QRegion::contains(const QPoint & p) const
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #6 : Ноябрь 19, 2014, 11:05 »

может есть смысл задействовать графическую сцену, тогда она уже сама будет вам возвращать какая кнопка (элемент) нажата?
посмотрите QGraphicsView/QGraphicsScene/QGraphicsItem
Записан
Crazy Sage
Гость
« Ответ #7 : Ноябрь 19, 2014, 11:07 »

Со сценами я умею работать, просто дизайн в виде одной картинки, на которой все кнопки разрисованы, при этом очень сжатые сроки, поэтому хочется минимизировать работу и не резать эту картинку на элементы, что для сцены всё равно потребуется.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Ноябрь 19, 2014, 11:33 »

Ну если надо срочно..

Код
C++ (Qt)
bool PointInsideNGon( const QPointF & src,  // point to test
                               const QRectF & R,     // N-gon bounding rectangle
                               int N,             // N-gpn side count
                               qreal phase = 0 )      // 0 = corner on x-axis
{
// point in local space
QPointF pt = src - R.center();
pt.rx() /= R.width() / 2;
pt.ry() /= R.height() / 2;
 
// angle inside sector
qreal angle = atan2(-pt.y(), pt.x()) + phase;
qreal step = M_PI * 2 / N;
int num = (int) (angle / step);
angle = (step + 0.5) * num;
 
// check dot
return pt.x() * cos(angle) + pt.y() * sin(angle) <= cos(step / 2);
}
Писал здесь, возможны ошибки. Смысл такой: точка попадает в один из секторов N-угольника (num), и проекция на биссектрису этого сектора должна быть меньше косинуса половины угла сектора. Нарисуйте на бумажке, все сразу станет ясно
Записан
Crazy Sage
Гость
« Ответ #9 : Ноябрь 19, 2014, 11:43 »

Спасибо
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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