crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Координаты мыши
epishev
  опции профиля:
сообщение 7.4.2011, 8:35
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 89
Регистрация: 23.3.2011
Пользователь №: 2533

Спасибо сказали: 0 раз(а)




Репутация:   0  


Всем привет, подскажите как получить координаты мыши,
относительно виджита, например QGraphicsView,

ну или на QGraphicsScene.

заранее спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 7.4.2011, 8:45
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

Спасибо сказали: 40 раз(а)




Репутация:   6  


Цитата(epishev @ 7.4.2011, 10:35) *
Всем привет, подскажите как получить координаты мыши,
относительно виджита, например QGraphicsView,

ну или на QGraphicsScene.

заранее спасибо!


Цитирую Макса Шлее: "Если же нужно получать события перемещения указателя мыши, то тогда нужно воспользоваться методом setMouseTracking() класса QWidget, передав ему в параметре значение true." "Для определения местоположения указателя мыши в момент возникновения СОбыТИЯ МОЖНО ВОСПОЛЬЗОВаТЬСЯ Методами globalX(), globalY(), х() И у (), которые возвращают целые значения. Также можно воспользоваться
методами pos о или giobaiPos о. Метод pos о класса QMouseEvent возвращает позицию указателя мыши в момент наступления события (позиция
относительно левого верхнего угла виджета). Если нужна абсолютная позиция (относительно левого верхнего угла экрана), то ее получают с помощью метода giobaiPos (). "

ну и пример из той же книги, setMouseTracking(true) не установлено, поэтому координаты отслеживаются лишь при нажатой кнопе. В фале main.cpp сразу же после создания виджета укажите
wgt.setMouseTracking(true);
и будет щасте.

Сообщение отредактировал silver47 - 7.4.2011, 8:52
Прикрепленные файлы
Прикрепленный файл  123.ZIP ( 1,58 килобайт ) Кол-во скачиваний: 169
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 7.4.2011, 8:50
Сообщение #3


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


Добрый день, есть несколько вариантов. Можно обработать несколько событий для QGraphicsScene или QGraphicsView установив eventFilter для соответствующих объектов, либо с помощью глобальной функции QCursor::pos() - которая возвращает координаты курсора мыши в глобальной системе и трансформировать данную точку сначала в систему координат QGraphicsView объекта методом QGraphicsView::mapFromGlobal, затем, полученный результат, в координаты сцены методом QGraphicsView::mapToScene.
Если же перехватывать события через eventFilter, тогда нужно перехватить событие QEvent::MouseMove , в данном событии содержаться данные о положении курсора с системе координат виджета. либо перехватить событие QEvent::GraphicsSceneMouseMove соответственно получим событие содержащее координаты курсора в системе координат сцены. Ну и третий способ, это пронаследоваться для нужного класса (QGraphicsView или QGraphicsScene) и переопределить соответствующие виртуальные методы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
epishev
  опции профиля:
сообщение 7.4.2011, 11:14
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 89
Регистрация: 23.3.2011
Пользователь №: 2533

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(wiz29 @ 7.4.2011, 9:50) *
Добрый день, есть несколько вариантов. Можно обработать несколько событий для QGraphicsScene или QGraphicsView установив eventFilter для соответствующих объектов, либо с помощью глобальной функции QCursor::pos() - которая возвращает координаты курсора мыши в глобальной системе и трансформировать данную точку сначала в систему координат QGraphicsView объекта методом QGraphicsView::mapFromGlobal, затем, полученный результат, в координаты сцены методом QGraphicsView::mapToScene.
Если же перехватывать события через eventFilter, тогда нужно перехватить событие QEvent::MouseMove , в данном событии содержаться данные о положении курсора с системе координат виджета. либо перехватить событие QEvent::GraphicsSceneMouseMove соответственно получим событие содержащее координаты курсора в системе координат сцены. Ну и третий способ, это пронаследоваться для нужного класса (QGraphicsView или QGraphicsScene) и переопределить соответствующие виртуальные методы.


Распишите позжалуйста более подробно...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 7.4.2011, 11:50
Сообщение #5


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


Цитата(epishev @ 7.4.2011, 12:14) *
Распишите позжалуйста более подробно...


Какой из вариантов конкретно?


если рассматривать "оторванную" от обработки событий реализацию, то она будет выглядеть примерно следующим образом:
 
#include <qcursor.h>
#include <qgraphicsview.h>

//возращает текущую позицию курсора в системе координат виджета gView
QPoint getViewCursorPos(const QGraphicsView& gView)
{
    return gView.mapFromGlobal(QCursor::pos());
}

//возращает текущую позицию курсора в системе координат сцены установленной в gView
QPointF getSceneCursorPos(const QGraphicsView& gView)
{
    return gView.mapToScene(getViewCursorPos(gView));
}


Либо ты можешь пронаследоваться от QGraphicsView:
class MyView
   : public QGraphicsView
{
    public:
         MyView(QWidget* parent = 0 );
        MyView(QGraphicsScene* scene, QWidget* parent = 0 );

    protected:

        //эту функцию реализуешь в соответсвии со своими потребностями.
        void mouseMoveEvent(QMouseEvent* event)
        {              
              QPoint viewPos = event->pos();//позиция в системе координат виджета
              QPointF scenePos(mapToScene(viewPos));//позиция в системе координат сцены.
              //твой код....
              QGraphicsView::mouseMoveEvent(event);
        }
};//class MyView


Сообщение отредактировал wiz29 - 7.4.2011, 11:52
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 7.4.2011, 13:13
Сообщение #6


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Такая же тема.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.11.2024, 20:28