Версия для печати темы
Форум на CrossPlatform.RU _ Qt GUI _ Не работает setMouseTracking()
Автор: NordWest 19.4.2009, 17:59
Нужно, чтобы в программе при движении мыши вызывался:
void MainWindow::mouseMoveEvent(QMouseEvent *event);
В конструкторе класса вызываю
this->setMouseTracking(true);
Но событие по прежнему ловится только при нажатой кнопке. Если у центрального виджета вызвать этот же метод - ситуация та же. Что не так?
Автор: Litkevich Yuriy 19.4.2009, 18:24
NordWest, проверь как работает пример %QTDIR%\examples\widgets\scribble
измени файл scribblearea.cpp
в конце конструктора добавь строку:
setMouseTracking ( true);
А в функции void ScribbleArea::mouseMoveEvent(QMouseEvent *event), закоментируй строчку условия, чтобы осталась только функция
drawLineTo(event->pos());
собери и посмотри, должно рисоватся без участия кнопки мыши.
Автор: SABROG 19.4.2009, 19:09
Таким образом пропиши:
setMouseTracking(true);
centralWidget()->setMouseTracking(true);
Автор: NordWest 19.4.2009, 20:04
Цитата(Litkevich Yuriy @ 19.4.2009, 19:24)

NordWest, проверь как работает пример %QTDIR%\examples\widgets\scribble
измени файл scribblearea.cpp
Ну да, работает. И у меня вызывается, если mouseMoveEvent() центрального виджета MainWindow вызывать, а не MainWindow().
Мне бы подошло, но информацию о положении мыши надо выдавать в строку состояния, а как я это сделаю из под виджета?..
Цитата(SABROG @ 19.4.2009, 20:09)

Таким образом пропиши:
setMouseTracking(true);
centralWidget()->setMouseTracking(true);
Таким образом всё работает двояко.
Если я создаю метод mouseMoveEvent (переопределяю наверное) в классе центрального виджета, то происходит следующее.
При движении мышки над центральным виджетом (картинка) трэкинг не работает, но mouseMoveEvent вызывается, тот что в классе центрального виджета. Если его не определять, то вызывается mouseMoveEvent у MainWindow и только с нажатием кнопки, т.е. без трэкинга.
При этом, при движении мыши над окном вне центрального виджета, трэкинг работает и координаты мышки выводятся в строку состояния.
Автор: SABROG 19.4.2009, 20:27
Цитата(NordWest @ 19.4.2009, 21:04)

Таким образом всё работает двояко.
Потому, что переопределил одновременно и у главного окна и у центрального виджета. События передаются виджетам по-цепочке, можешь в QMainWindow::mouseMoveEvent сделать accept и событие дальше не пойдет.
Цитата(NordWest @ 19.4.2009, 21:04)

При движении мышки над центральным виджетом (картинка) трэкинг не работает, но mouseMoveEvent вызывается, тот что в классе центрального виджета.
Какая картинка?
Когда ты водишь мышкой по главному окну - ты водишь мышкой над центральным виджетом. Изначально mouseTracking отключен у окон, в итоге этот центральный виджет не ловит и не пересылает события мыши другим окнам. Поэтому мы сначала ставим трэкинг у него, чтобы события начались пересылаться, но т.к. у главного окна тоже трэкинг вырублен, то он события мышки просто игнорит, после того как включаем - он начинает реагировать. Проще переопределить mouseMoveEvent у QMainWindow вместо того, чтобы вызывать installEventFilter у центрального виджета или создавать свой центральный виджет. Но в принципе будет правильным это сделать.
Автор: NordWest 19.4.2009, 21:08
Цитата(SABROG @ 19.4.2009, 21:27)

QMainWindow::mouseMoveEvent сделать accept и событие дальше не пойдет.
Это как? accept()?
Цитата(NordWest @ 19.4.2009, 21:38)

Проще переопределить mouseMoveEvent у QMainWindow вместо того, чтобы вызывать installEventFilter у центрального виджета или создавать свой центральный виджет. Но в принципе будет правильным это сдела
У меня eventFilter определены так:
imgLabel->installEventFilter(this);
this->installEventFilter(this);
imgLabel - это центральный виджет, наследник от QLabel
===================================
Заработало.
В общем надо было в QMainWindow:
MainWindow::MainWindow()
{
setMouseTracking(true);
centralWidget()->setMouseTracking(true);
}
И в конструкторе центрального виджета:
setMouseTracking(true);
И всё. Спасибо за помощь!
Автор: Гость_Андрей_* 20.7.2013, 21:31
Цитата(NordWest @ 19.4.2009, 17:59)

Нужно, чтобы в программе при движении мыши вызывался:
void MainWindow::mouseMoveEvent(QMouseEvent *event);
В конструкторе класса вызываю
this->setMouseTracking(true);
Но событие по прежнему ловится только при нажатой кнопке. Если у центрального виджета вызвать этот же метод - ситуация та же. Что не так?
Автор: Гость_Андрей_* 20.7.2013, 21:38
Сталкивался в Qt с подобной проблемой при использовании виджетов Qwt.
Оказалось, надо сделать не только
QwtPlot->setMouseTracking(true);
но ещё и добавить строку
QwtPlot->canvas()->setMouseTrakcking(true);
Только тогда в фильтре событий будет отлавливаться QEvent::MouseMove для QwtPlot.
Автор: Гость_Андрей_* 20.7.2013, 21:39
Сталкивался в Qt с подобной проблемой при использовании виджетов Qwt.
Оказалось, надо сделать не только
QwtPlot->setMouseTracking(true);
но ещё и добавить строку
QwtPlot->canvas()->setMouseTrakcking(true);
Только тогда в фильтре событий будет отлавливаться QEvent::MouseMove для QwtPlot.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)