Не работает setMouseTracking() |
Здравствуйте, гость ( Вход | Регистрация )
Не работает setMouseTracking() |
NordWest |
19.4.2009, 17:59
Сообщение
#1
|
Студент Группа: Участник Сообщений: 86 Регистрация: 26.11.2008 Пользователь №: 433 Спасибо сказали: 1 раз(а) Репутация: 0 |
Нужно, чтобы в программе при движении мыши вызывался:
В конструкторе класса вызываю
Но событие по прежнему ловится только при нажатой кнопке. Если у центрального виджета вызвать этот же метод - ситуация та же. Что не так? |
|
|
Litkevich Yuriy |
19.4.2009, 18:24
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
NordWest, проверь как работает пример %QTDIR%\examples\widgets\scribble
измени файл scribblearea.cpp в конце конструктора добавь строку: setMouseTracking ( true); А в функции void ScribbleArea::mouseMoveEvent(QMouseEvent *event), закоментируй строчку условия, чтобы осталась только функция drawLineTo(event->pos()); собери и посмотри, должно рисоватся без участия кнопки мыши. |
|
|
SABROG |
19.4.2009, 19:09
Сообщение
#3
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Таким образом пропиши:
|
|
|
NordWest |
19.4.2009, 20:04
Сообщение
#4
|
Студент Группа: Участник Сообщений: 86 Регистрация: 26.11.2008 Пользователь №: 433 Спасибо сказали: 1 раз(а) Репутация: 0 |
NordWest, проверь как работает пример %QTDIR%\examples\widgets\scribble измени файл scribblearea.cpp Ну да, работает. И у меня вызывается, если mouseMoveEvent() центрального виджета MainWindow вызывать, а не MainWindow(). Мне бы подошло, но информацию о положении мыши надо выдавать в строку состояния, а как я это сделаю из под виджета?.. Таким образом пропиши:
Таким образом всё работает двояко. Если я создаю метод mouseMoveEvent (переопределяю наверное) в классе центрального виджета, то происходит следующее. При движении мышки над центральным виджетом (картинка) трэкинг не работает, но mouseMoveEvent вызывается, тот что в классе центрального виджета. Если его не определять, то вызывается mouseMoveEvent у MainWindow и только с нажатием кнопки, т.е. без трэкинга. При этом, при движении мыши над окном вне центрального виджета, трэкинг работает и координаты мышки выводятся в строку состояния. |
|
|
SABROG |
19.4.2009, 20:27
Сообщение
#5
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Таким образом всё работает двояко. Потому, что переопределил одновременно и у главного окна и у центрального виджета. События передаются виджетам по-цепочке, можешь в QMainWindow::mouseMoveEvent сделать accept и событие дальше не пойдет. При движении мышки над центральным виджетом (картинка) трэкинг не работает, но mouseMoveEvent вызывается, тот что в классе центрального виджета. Какая картинка? Когда ты водишь мышкой по главному окну - ты водишь мышкой над центральным виджетом. Изначально mouseTracking отключен у окон, в итоге этот центральный виджет не ловит и не пересылает события мыши другим окнам. Поэтому мы сначала ставим трэкинг у него, чтобы события начались пересылаться, но т.к. у главного окна тоже трэкинг вырублен, то он события мышки просто игнорит, после того как включаем - он начинает реагировать. Проще переопределить mouseMoveEvent у QMainWindow вместо того, чтобы вызывать installEventFilter у центрального виджета или создавать свой центральный виджет. Но в принципе будет правильным это сделать. |
|
|
NordWest |
19.4.2009, 21:08
Сообщение
#6
|
Студент Группа: Участник Сообщений: 86 Регистрация: 26.11.2008 Пользователь №: 433 Спасибо сказали: 1 раз(а) Репутация: 0 |
QMainWindow::mouseMoveEvent сделать accept и событие дальше не пойдет. Это как? accept()? Проще переопределить mouseMoveEvent у QMainWindow вместо того, чтобы вызывать installEventFilter у центрального виджета или создавать свой центральный виджет. Но в принципе будет правильным это сдела У меня eventFilter определены так:
imgLabel - это центральный виджет, наследник от QLabel =================================== Заработало. В общем надо было в QMainWindow:
И в конструкторе центрального виджета:
И всё. Спасибо за помощь! Сообщение отредактировал NordWest - 19.4.2009, 20:41 |
|
|
Гость_Гость_Андрей_*_* |
20.7.2013, 21:31
Сообщение
#7
|
Гости |
Нужно, чтобы в программе при движении мыши вызывался:
В конструкторе класса вызываю
Но событие по прежнему ловится только при нажатой кнопке. Если у центрального виджета вызвать этот же метод - ситуация та же. Что не так? |
|
|
Гость_Гость_Андрей_*_* |
20.7.2013, 21:38
Сообщение
#8
|
Гости |
Сталкивался в Qt с подобной проблемой при использовании виджетов Qwt.
Оказалось, надо сделать не только QwtPlot->setMouseTracking(true); но ещё и добавить строку QwtPlot->canvas()->setMouseTrakcking(true); Только тогда в фильтре событий будет отлавливаться QEvent::MouseMove для QwtPlot. |
|
|
Гость_Гость_Андрей_*_* |
20.7.2013, 21:39
Сообщение
#9
|
Гости |
Сталкивался в Qt с подобной проблемой при использовании виджетов Qwt.
Оказалось, надо сделать не только QwtPlot->setMouseTracking(true); но ещё и добавить строку QwtPlot->canvas()->setMouseTrakcking(true); Только тогда в фильтре событий будет отлавливаться QEvent::MouseMove для QwtPlot. |
|
|
Текстовая версия | Сейчас: 24.11.2024, 3:56 |