События в QGraphicsView

#c #qt #events #qt4 #qgraphicsview

#c #qt #Мероприятия #qt4 #qgraphicsview

Вопрос:

У меня возникли проблемы с получением событий в 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));
}
  

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

Комментарии:

1. Я не знаю, что вы делаете, но почему вы создаете новый QGraphicsView внутри QGraphicsView? Рассмотрите возможность удаления переменной «view» и вместо view-> setXXX просто setXXX.

2. Да, именно в этом и заключалась проблема. Спасибо

Ответ №1:

Вы не получаете события, потому что они обрабатываются 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::rasImg(QString file)
  : QGraphicsScene()
{
  // any constructor work you need to do
}


rasImg::initialize()
{
 addText("HELLO");
 setSceneRect(QRect(0, 0, MaxRow, MaxCol));
 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);
}
  

Комментарии:

1. Ну, в моем реальном коде QGraphicsScene и QGraphicsView инициализированы в другой функции. Я поместил это в конструктор для простоты. Теперь взгляните на код … как бы мне поступить?

2. На самом деле я допустил ошибку в коде… Я добавил qgraphicsview в подкласс, а не QGraphicsScene… Теперь я немного отредактировал свой код… Не могли бы вы взглянуть.

3. Спасибо, это было идеально… Запустил свой код … не понимал, что у меня инициализированы два отдельных QGraphicsView.

Ответ №2:

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

 void rasImg::mousePressEvent (QGraphicsSceneMouseEvent *event)
  

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

 void rasImg::mousePressEvent ( QMouseEvent *event )
  

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

Комментарии:

1. Тогда у вас происходит что-то другое, поскольку в данный момент я рассматриваю класс, производный от QGraphicsView, который использует mousePressEvent (QMouseEvent *), и он действительно получает события. Попробуйте разобраться с проблемой, выполнив сначала что-нибудь очень простое.

2. Вы должны, по крайней мере, видеть отладочный вывод из события. Фон не может измениться, поскольку вы меняете его из сцены, которая не прикреплена к представлению, которое получает эти события. У вас там немного запутанная часть.

Ответ №3:

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

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