| Название: Зона курсора Отправлено: Igors от Февраля 12, 2014, 10:12 Добрый день На виджете нарисована линия, при "наезде" на нее курсор должен измениться показывая что линию можно передвинуть. Должен ли я отслеживать mouseMove или есть более приятное/высокоуровневое решение? Спасибо Название: Re: Зона курсора Отправлено: Old от Февраля 12, 2014, 10:16 Сделать из линии виджет. Название: Re: Зона курсора Отправлено: _OLEGator_ от Февраля 12, 2014, 10:25 Странный вопрос от "гуру". Если ты самостоятельно рисуешь линию, то о ней знаешь только ты - соответственно только mouseMove. А так есть QGraphicsScene. Название: Re: Зона курсора Отправлено: Igors от Февраля 12, 2014, 10:37 Сделать из линии виджет.Нельзя из др соображений Странный вопрос от "гуру". Если ты самостоятельно рисуешь линию, то о ней знаешь только ты - соответственно только mouseMove.mouseMove просто так не получить, а лезть через notify не тянет. Может событие тултипа задействовать, но тогда не видно как быстро сбросить установленный курсор. Возня с таймером тоже выглядит неаккуратно. В общем я ожидал большего от знатоков UI/графики  :) Название: Re: Зона курсора Отправлено: Hellraiser от Февраля 12, 2014, 10:43 Что значит "просто так не получить"? Если виджет имеет своим предком QWidget, то надо ставить отслеживание движения мыши, т.к. по-умолчанию оно запрещено и включается только при зажатой кнопке. Код 
 Название: Re: Зона курсора Отправлено: Igors от Февраля 12, 2014, 10:51 Что значит "просто так не получить"? Если виджет имеет своим предком QWidget, то надо ставить отслеживание движения мыши, т.к. по-умолчанию оно запрещено и включается только при зажатой кнопке.А не дороговато ли такое решение? И что если др виджет(ы) имеют подобные "зоны курсора"? Код 
 Название: Re: Зона курсора Отправлено: GreatSnake от Февраля 12, 2014, 10:55 Сделать из линии виджет.И чем это поможет, если линия не под прямым углом? Что значит "просто так не получить"? Если виджет имеет своим предком QWidget, то надо ставить отслеживание движения мыши, т.к. по-умолчанию оно запрещено и включается только при зажатой кнопке.А не дороговато ли такое решение? Код 
 Цитировать И что если др виджет(ы) имеют подобные "зоны курсора"? И? Название: Re: Зона курсора Отправлено: Bepec от Февраля 12, 2014, 10:58 Если сделать линию виджетом и задать ей setTracking + в получаемом евенте MouseMove проверять вхождение в область линии, то вполне можно устанавливать и сбрасывать курсор на нужный. PS попробую :D Интересно же. Название: Re: Зона курсора Отправлено: GreatSnake от Февраля 12, 2014, 11:02 Если сделать линию виджетом и задать ей setTracking + в получаемом евенте MouseMove проверять вхождение в область линии, то вполне можно устанавливать и сбрасывать курсор на нужный.А если линия не в отдельном виджете, то уже и нельзя? :) Название: Re: Зона курсора Отправлено: _OLEGator_ от Февраля 12, 2014, 11:07 Помню такое извращение было реализовано в движке карт от КБ Панорама под Qt, где каждый объект карты - отдельный виджет. Название: Re: Зона курсора Отправлено: Igors от Февраля 12, 2014, 11:12 И чем это поможет, если линия не под прямым углом?В данном случае под прямым, но в целом - очень веский аргумент, "делать виджет" мало того что дорого, так еще и не работает в общем случае Странный вопрос, коли потребовалась такая фича. За всё нужно платить.Да, но как заплатить меньше? :) Судя по исходникам setMouseTracking "один на всех", значит это тоже не выход. Название: Re: Зона курсора Отправлено: Hellraiser от Февраля 12, 2014, 11:18 А что мешает установить трекинг только для какого-то конкретного виджета? Название: Re: Зона курсора Отправлено: Igors от Февраля 12, 2014, 11:35 Судя по исходникам setMouseTracking "один на всех", значит это тоже не выход.Проверил - нет, сколько угодно виджетов могут иметь tracking = true и mouseMove (с отжатым мышем) приходит только когда курсор над виджетом. Все-таки наверное mouseMove Название: Re: Зона курсора Отправлено: GreatSnake от Февраля 12, 2014, 12:48 В догонку насчёт о дороговизне setMouseTracking(true)... Не знаю как в других системах, а в X11 на каждом окне, созданном Qt всегда выставляется маска PointerMotionMask независимо от setMouseTracking(). Т.е. задаётся mouseTracking или нет, Qt-приложение всегда будет возбуждаться от движения курсором над его окном :( Название: Re: Зона курсора Отправлено: Igors от Февраля 12, 2014, 12:56 В OSX оно тоже всегда приходит и через notify (или фильтры) его можно отловить независимо от установки tracking. Просто хотелось бы "задать зону" (ну или callback) вместо наращивания mouseMoveEvent. По аналогии напр с тултипами. Ну ладно, нет так нет, переживу с mouseMove  :) Название: Re: Зона курсора Отправлено: Bepec от Февраля 12, 2014, 13:43 Сделал ради интереса небольшой проектик. Если линия не прямая не пашет :D Тут уже думать надо дальше. https://dl.dropboxusercontent.com/u/101053289/Program/mouseTest.7z Название: Re: Зона курсора Отправлено: Igors от Февраля 12, 2014, 15:07 Для полноты картины добавим что в нативном API есть возможность задать прямоугольники (минимум). Напр на Cocoa Qt не заботится об установке курсора на каждом mouseEvent |