События в QGraphicsView - PullRequest
0 голосов
/ 07 мая 2011

У меня проблемы с получением событий в QGraphicsView работе.Я вложил в подкласс QGraphicsView и попытался перегрузить mousePressEvent и wheelEvent.Но ни mousePressEvent, ни wheelEvent не вызовут.

Вот мой код (сейчас несколько правок):

Объявление:

#include <QGraphicsView>
#include <QGraphicsScene>
class rasImg: public QGraphicsView
{
public:
rasImg(QString file);
~rasImg(void);
    initialize();
QGraphicsView *view;
QGraphicsScene *scene;
private:
virtual void mousePressEvent (QGraphicsSceneMouseEvent  *event);
virtual void wheelEvent ( QGraphicsSceneMouseEvent  * event );
}

Определение:

#include "rasImg.h"
void rasImg::initialize()
{
view = new QGraphicsView();
scene = new QGraphicsScene(QRect(0, 0, MaxRow, MaxCol));
scene->addText("HELLO");
scene->setBackgroundBrush(QColor(100,100,100));
view->setDragMode(QGraphicsView::ScrollHandDrag);
view->setScene(scene);
}
void rasImg::mousePressEvent (QGraphicsSceneMouseEvent  *event)
{
    qDebug()<<"Mouse released";
    scene->setBackgroundBrush(QColor(100,0,0));
}
void rasImg::wheelEvent ( QGraphicsSceneMouseEvent  * event )
{
qDebug()<<"Mouse released";
    scene->setBackgroundBrush(QColor(100,0,0));
}

Итак, что я делаю не так?
Почему я не вижу сообщения или изменение цвета фона, когда я нажимаю на вид или использую колесо мыши?

Ответы [ 3 ]

1 голос
/ 07 мая 2011

QGraphicsView является производным от QWidget.Поэтому он получает события мыши как обычные виджеты.Если ваш код действительно

void rasImg::mousePressEvent (QGraphicsSceneMouseEvent *event)

Он не может получать события, поскольку он должен быть

void rasImg::mousePressEvent ( QMouseEvent *event )

QGraphicsSceneMouseEvent для элементов в QGraphicsScene, которые получают ввод от мыши.1009 *

1 голос
/ 07 мая 2011

Вы не получаете события, потому что они обрабатываются создаваемым объектом scene, а не вашим классом.

Удалите QGraphicsScene *scene; из вашего rasImg и попробуйтевот так для конструктора:

rasImg::rasImg(QString file)
  : QGraphicsScene(QRect(0, 0, MaxRow, MaxCol))
{
 addText("HELLO");
 setBackgroundBrush(QColor(100,100,100));
 setDragMode(QGraphicsView::ScrollHandDrag);

 view = new QGraphicsView();
 view->setScene(this);
}

Если вы хотите сделать это в два шага, вы можете сделать:вашего rasImg, а не экземпляра QGraphicsScene.

Если это представление, которое вы подклассифицируете, сделайте то же самое.Отображаемое вами представление должно быть экземпляром вашего класса, а не простым QGraphicsView.

rasImg::rasImg(QString file)
    : QGraphicsView()
{
   // constructor work
}

void rasImg::initialize()
{
  scene = new QGraphicsScene(QRect(0, 0, MaxRow, MaxCol));
  scene->addText("HELLO");
  scene->setBackgroundBrush(QColor(100,100,100));

  setDragMode(QGraphicsView::ScrollHandDrag);
  setScene(scene);
}
0 голосов
/ 25 июля 2012

Если вы хотите обрабатывать щелчки по определенному элементу графического интерфейса, а не обрабатывать щелчки по всей сцене, вы должны получить собственный класс либо из QGraphicsItem (см. Пример SimpleClass здесь )или производные от одного из существующих элементов, например QGraphicsPixmapItem.

В обоих случаях в вашем производном классе вы можете переопределить void mousePressEvent(QGraphicsSceneMouseEvent *event);

...