Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Igors от Февраль 12, 2014, 10:12



Название: Зона курсора
Отправлено: 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, то надо ставить отслеживание движения мыши, т.к. по-умолчанию оно запрещено и включается только при зажатой кнопке.
Код
C++ (Qt)
setMouseTracking(true);


Название: Re: Зона курсора
Отправлено: Igors от Февраль 12, 2014, 10:51
Что значит "просто так не получить"? Если виджет имеет своим предком QWidget, то надо ставить отслеживание движения мыши, т.к. по-умолчанию оно запрещено и включается только при зажатой кнопке.
Код
C++ (Qt)
setMouseTracking(true);
А не дороговато ли такое решение? И что если др виджет(ы) имеют подобные "зоны курсора"?


Название: Re: Зона курсора
Отправлено: GreatSnake от Февраль 12, 2014, 10:55
Сделать из линии виджет.
И чем это поможет, если линия не под прямым углом?

Что значит "просто так не получить"? Если виджет имеет своим предком QWidget, то надо ставить отслеживание движения мыши, т.к. по-умолчанию оно запрещено и включается только при зажатой кнопке.
Код
C++ (Qt)
setMouseTracking(true);
А не дороговато ли такое решение?
Странный вопрос, коли потребовалась такая фича. За всё нужно платить.
Цитировать
И что если др виджет(ы) имеют подобные "зоны курсора"?
И?


Название: 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