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