Название: Зона курсора Отправлено: 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
|