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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Зона курсора  (Прочитано 7641 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Февраль 12, 2014, 10:12 »

Добрый день

На виджете нарисована линия, при "наезде" на нее курсор должен измениться показывая что линию можно передвинуть. Должен ли я отслеживать mouseMove или есть более приятное/высокоуровневое решение?

Спасибо
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Февраль 12, 2014, 10:16 »

Сделать из линии виджет.
Записан
_OLEGator_
Гость
« Ответ #2 : Февраль 12, 2014, 10:25 »

Странный вопрос от "гуру". Если ты самостоятельно рисуешь линию, то о ней знаешь только ты - соответственно только mouseMove.
А так есть QGraphicsScene.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Февраль 12, 2014, 10:37 »

Сделать из линии виджет.
Нельзя из др соображений

Странный вопрос от "гуру". Если ты самостоятельно рисуешь линию, то о ней знаешь только ты - соответственно только mouseMove.
mouseMove просто так не получить, а лезть через notify не тянет. Может событие тултипа задействовать, но тогда не видно как быстро сбросить установленный курсор. Возня с таймером тоже выглядит неаккуратно. В общем я ожидал большего от знатоков UI/графики  Улыбающийся
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #4 : Февраль 12, 2014, 10:43 »

Что значит "просто так не получить"? Если виджет имеет своим предком QWidget, то надо ставить отслеживание движения мыши, т.к. по-умолчанию оно запрещено и включается только при зажатой кнопке.
Код
C++ (Qt)
setMouseTracking(true);
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Февраль 12, 2014, 10:51 »

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

Сообщений: 2921



Просмотр профиля
« Ответ #6 : Февраль 12, 2014, 10:55 »

Сделать из линии виджет.
И чем это поможет, если линия не под прямым углом?

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

Qt 5.11/4.8.7 (X11/Win)
Bepec
Гость
« Ответ #7 : Февраль 12, 2014, 10:58 »

Если сделать линию виджетом и задать ей setTracking + в получаемом евенте MouseMove проверять вхождение в область линии, то вполне можно устанавливать и сбрасывать курсор на нужный.

PS попробую Веселый Интересно же.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #8 : Февраль 12, 2014, 11:02 »

Если сделать линию виджетом и задать ей setTracking + в получаемом евенте MouseMove проверять вхождение в область линии, то вполне можно устанавливать и сбрасывать курсор на нужный.
А если линия не в отдельном виджете, то уже и нельзя? Улыбающийся
Записан

Qt 5.11/4.8.7 (X11/Win)
_OLEGator_
Гость
« Ответ #9 : Февраль 12, 2014, 11:07 »

Помню такое извращение было реализовано в движке карт от КБ Панорама под Qt, где каждый объект карты - отдельный виджет.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Февраль 12, 2014, 11:12 »

И чем это поможет, если линия не под прямым углом?
В данном случае под прямым, но в целом - очень веский аргумент, "делать виджет" мало того что дорого, так еще и не работает в общем случае

Странный вопрос, коли потребовалась такая фича. За всё нужно платить.
Да, но как заплатить меньше? Улыбающийся Судя по исходникам setMouseTracking "один на всех", значит это тоже не выход.
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #11 : Февраль 12, 2014, 11:18 »

А что мешает установить трекинг только для какого-то конкретного виджета?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Февраль 12, 2014, 11:35 »

Судя по исходникам setMouseTracking "один на всех", значит это тоже не выход.
Проверил - нет, сколько угодно виджетов могут иметь tracking = true и mouseMove (с отжатым мышем) приходит только когда курсор над виджетом. Все-таки наверное mouseMove
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #13 : Февраль 12, 2014, 12:48 »

В догонку насчёт о дороговизне setMouseTracking(true)...
Не знаю как в других системах, а в X11 на каждом окне, созданном Qt всегда выставляется маска PointerMotionMask независимо от setMouseTracking().
Т.е. задаётся mouseTracking или нет, Qt-приложение всегда будет возбуждаться от движения курсором над его окном Грустный
Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Февраль 12, 2014, 12:56 »

В OSX оно тоже всегда приходит и через notify (или фильтры) его можно отловить независимо от установки tracking. Просто хотелось бы "задать зону" (ну или callback) вместо наращивания mouseMoveEvent. По аналогии напр с тултипами. Ну ладно, нет так нет, переживу с mouseMove  Улыбающийся
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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