crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Не работает setMouseTracking()
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Гость_Андрей_* Дата 20.7.2013, 21:39
  Сталкивался в Qt с подобной проблемой при использовании виджетов Qwt.
Оказалось, надо сделать не только

QwtPlot->setMouseTracking(true);

но ещё и добавить строку

QwtPlot->canvas()->setMouseTrakcking(true);

Только тогда в фильтре событий будет отлавливаться QEvent::MouseMove для QwtPlot.
Гость_Андрей_* Дата 20.7.2013, 21:38
  Сталкивался в Qt с подобной проблемой при использовании виджетов Qwt.
Оказалось, надо сделать не только

QwtPlot->setMouseTracking(true);

но ещё и добавить строку

QwtPlot->canvas()->setMouseTrakcking(true);

Только тогда в фильтре событий будет отлавливаться QEvent::MouseMove для QwtPlot.
Гость_Андрей_* Дата 20.7.2013, 21:31
 
Цитата(NordWest @ 19.4.2009, 17:59) *
Нужно, чтобы в программе при движении мыши вызывался:
void MainWindow::mouseMoveEvent(QMouseEvent *event);


В конструкторе класса вызываю
this->setMouseTracking(true);


Но событие по прежнему ловится только при нажатой кнопке. Если у центрального виджета вызвать этот же метод - ситуация та же. Что не так?

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);


И всё. Спасибо за помощь!
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, 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, 19:09
  Таким образом пропиши:

    setMouseTracking(true);
    centralWidget()->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());
собери и посмотри, должно рисоватся без участия кнопки мыши.
NordWest Дата 19.4.2009, 17:59
  Нужно, чтобы в программе при движении мыши вызывался:
void MainWindow::mouseMoveEvent(QMouseEvent *event);


В конструкторе класса вызываю
this->setMouseTracking(true);


Но событие по прежнему ловится только при нажатой кнопке. Если у центрального виджета вызвать этот же метод - ситуация та же. Что не так?
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 27.4.2024, 22:02