Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Druid от Октябрь 06, 2006, 13:37



Название: Сообщения на графике
Отправлено: Druid от Октябрь 06, 2006, 13:37
Привет. У меня qwt 5.0.0. Вывел график на экран с помощью QwtPlot. Как можно сделать, чтобы при наведении на график или при щелчке мыши на нем появлялось небольшое сообщение с координатами или другой информацией?


Название: Сообщения на графике
Отправлено: bigirbis от Октябрь 06, 2006, 14:07
Инсталлируй eventFilter на область рисования и отлавливай QMouseEvent.


Название: Сообщения на графике
Отправлено: Druid от Октябрь 06, 2006, 15:20
спасибо


Название: Сообщения на графике
Отправлено: Druid от Октябрь 11, 2006, 09:55
Нашел информацию по eventFilter. Однако никак не могу его прописать.
Пишу в конструкторе главного виджета:
Код:

#include <qwt_plot.h>
...
...
 Graphic = new QwtPlot( this, "Graphic" );
 Graphic->setGeometry( QRect( 10, 110, 610, 500 ) );
 Graphic->installEventFilter(new MouseFilter(&Graphic));
...


Пишу в MouseFilter.h:
Код:

#ifndef _MouseFilter_h_
#define _MouseFilter_h_

#include <qobject.h>

class MouseFilter : public QObject {
//Q_OBJECT
protected:
virtual bool eventFilter(QObject*, QEvent*);

public:
MouseFilter(QObject* pobj = 0, const char* pszName = 0);
};

#endif


Пишу в MouseFilter.cpp:
Код:

#include <qapplication.h>
#include <qmessagebox.h>
#include <qwt_plot.h>
#include "MouseFilter.h"

MouseFilter::MouseFilter(QObject* pobj, const char* pszName) : QObject(pobj, pszName)
{
}

bool MouseFilter::eventFilter(QObject* pobj, QEvent* pe)
{
if(QwtPlot::enterEvent(pe)) {
QMessageBox::information(0, "Class name", pobj->className());
return true;
}
}


Пример пытался создать по аналогии с книжкой, но там реакция на нажате клавиши была написана.
Подскажите как можно реализовать действия если мышь входит в область графика, который сам расположен на виджете?

добавлено спустя 14 минут:

 
Цитата: "Druid"
Изменил немного код и вроде все заработало. Пишу в конструкторе главного виджета:
Код:

#include <qwt_plot.h>
...
...
 Graphic = new QwtPlot( this, "Graphic" );
 Graphic->setGeometry( QRect( 10, 110, 610, 500 ) );
 Graphic->installEventFilter(new MouseFilter());//изменено
...


Пишу в MouseFilter.cpp:
Код:

#include <qapplication.h>
#include <qmessagebox.h>
#include <qwt_plot.h>
#include "MouseFilter.h"

MouseFilter::MouseFilter(QObject* pobj, const char* pszName) : QObject(pobj, pszName)
{
}

bool MouseFilter::eventFilter(QObject* pobj, QEvent* pe)
{
if(pe->type() == QEvent::Enter) {
QMessageBox::information(0, "Class name", pobj->className());
return true;
}
}



Теперь отлавливает, осталось отлавливать с учетом позиции мыши и придумать что на графике можно использовать в качестве вылезающего сообщения, как "всплывающие подсказки". Но это уже дело техники :)


Название: Сообщения на графике
Отправлено: bigirbis от Октябрь 11, 2006, 11:37
Весьма странный подход.
Код:

Graphic = new QwtPlot( this, "Graphic" );
...
Graphic->installEventFilter( this );

Код:

MyWidget::eventFilter( QObject * 0, QEvent * e )
{
 if( e.type() == QEvent::MouseMove )
 {
  ...
 }
 ...
}

Может я от жизни отстал?


Название: Сообщения на графике
Отправлено: Druid от Октябрь 11, 2006, 14:38
хм... что-то оно не работает ((
QEvent::MouseMove


Название: Сообщения на графике
Отправлено: bigirbis от Октябрь 11, 2006, 17:50
Это я для примера написал. На самом деле надо инсталлировать на виджет с графиком (он на плоте сверху лежит), как называется не помню (plotArea чтоли).