Перехватить все события мыши, Как будто нажали мышку и тянем |
Здравствуйте, гость ( Вход | Регистрация )
Перехватить все события мыши, Как будто нажали мышку и тянем |
Obey-Kun |
31.1.2011, 4:19
Сообщение
#1
|
Студент Группа: Участник Сообщений: 96 Регистрация: 24.3.2010 Пользователь №: 1556 Спасибо сказали: 3 раз(а) Репутация: 0 |
Здравствуйте. Проблема такая. У меня в одном виджете есть ручной скроллинг. Зажали правую кнопку → тащим. Оно прокручивается. Причём когда курсор достигает края экрана, он перепрыгивает на противоположную его (экрана) сторону — как в Okular.
Теперь хочу реализовать прокрутку с зажатым пробелом. То есть так: зажали пробел → двигаем курсором. Проблема в том, что если мы зажимаем на виджете кнопку мыши и водим курсором, то он ловит все события с неё — даже если она выйдет за края окна. Как можно заставить его делать так же в случае с пробелом? Кто-нибудь такое реализовывал? upd: вот только что нашёл по теме http://forum.sources.ru/index.php?showtopic=302429 (правда, у него там ничего и не получилось, вроде). Сообщение отредактировал Obey-Kun - 31.1.2011, 4:26 |
|
|
Алексей1153 |
31.1.2011, 10:43
Сообщение
#2
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
>>Как можно заставить его делать так же в случае с пробелом?
Цитата void QWidget::grabMouse () Grabs the mouse input. This widget receives all mouse events until releaseMouse() is called; other widgets get no mouse events at all. Keyboard events are not affected. Use grabKeyboard() if you want to grab that. Warning: Bugs in mouse-grabbing applications very often lock the terminal. Use this function with extreme caution, and consider using the -nograb command line option while debugging. It is almost never necessary to grab the mouse when using Qt, as Qt grabs and releases it sensibly. In particular, Qt grabs the mouse when a mouse button is pressed and keeps it until the last button is released. Note: Only visible widgets can grab mouse input. If isVisible() returns false for a widget, that widget cannot call grabMouse(). Note: (Mac OS X developers) For Cocoa, calling grabMouse() on a widget only works when the mouse is inside the frame of that widget. For Carbon, it works outside the widget's frame as well, like for Windows and X11. See also releaseMouse(), grabKeyboard(), and releaseKeyboard(). вроде это во избежание залочивания по ошибке можно запустить таумер, который будет проверять, не отпустили ли пробел. Если отпустили - релизим мышь, останавливаем таймер Сообщение отредактировал Алексей1153 - 31.1.2011, 10:44 |
|
|
igor_bogomolov |
31.1.2011, 10:48
Сообщение
#3
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
|
|
|
Алексей1153 |
31.1.2011, 11:07
Сообщение
#4
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
igor_bogomolov, а что именно должно быть не просто ? Ну а так - на Qt не делал ещё подобное.
|
|
|
igor_bogomolov |
31.1.2011, 11:20
Сообщение
#5
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
igor_bogomolov, а что именно должно быть не просто ? Ну а так - на Qt не делал ещё подобное. нет возможности средствами Qt узнать нажат ли пробел, или любая другая кнопка, за исключением модификаторов. Да и события от клавиатуры посмотри как генерируются. Если ты нажмёшь пробел, тебе с частотой 400мс (это настраивается) быдут последовательно приходить события keyPressEvent, keyReleaseEvent. Т.е. я так с ходу не могу даже сообразить как свою таблицу состояний клавиатуры сделать. Видимо здесь без использования API системы не обойтись. Всё это конечно лишь моё мнение, возможно я что то упустил в документации. |
|
|
Алексей1153 |
31.1.2011, 11:23
Сообщение
#6
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
igor_bogomolov, при отпускании должна вызваться keyReleaseEvent, там следует сбросить флаг нажатости (просто мембер класса), взведённый по началу grab
Таймер увидит, что флаг сброшен и релизнет мышку + сам себя остановит. Вроде всё логично |
|
|
igor_bogomolov |
31.1.2011, 11:25
Сообщение
#7
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
ты опять меня не понял. keyReleaseEvent будет приходить каждые 400мс, даже когда кнопка нажата
|
|
|
Алексей1153 |
31.1.2011, 11:27
Сообщение
#8
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
как так
щас проверю Сообщение отредактировал Алексей1153 - 31.1.2011, 11:28 |
|
|
igor_bogomolov |
31.1.2011, 11:33
Сообщение
#9
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
ну ё моё, ну Алексей, ты что? События нажатия кнопки мыши будет повторяться пока ты не отпустишь кнопку. Открой любой текстовый редактор, нажми букву какую-нибудь и держи. Сколько раз она напечатается? Дофига, она будет печататься пока не отпустишь кнопку. Так же и в программе, ты будешь с оределённым интервалом получать события keyPressEvent, keyReleaseEvent. И будет это происходить пока ты не отпустишь кнопку. Последнее событие будет конечно же keyReleaseEvent
|
|
|
Алексей1153 |
31.1.2011, 11:38
Сообщение
#10
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
оть
Цитата press repeating release press repeating release press repeating release press repeating release press repeating release press repeating release press repeating release press repeating release press repeating release press repeating release press repeating release press repeating release press release События нажатия кнопки мыши будет повторяться пока ты не отпустишь кнопку мыши ? Сообщение отредактировал Алексей1153 - 31.1.2011, 11:38 |
|
|
Текстовая версия | Сейчас: 12.12.2024, 9:32 |