mousePressEvent не работает с простым QGraphicsView

Я изучаю библиотеки qt для проекта в моем университете.
Я пытаюсь создать простое окно с просто graphicsView в него, ловя координаты мыши только тогда, когда курсор находится внутри graphicsView,
Я попробовал сначала с mouseMoveEvent функции, но я не смог заставить его работать.
Я пробовал тогда с filterи даже с ними не работает.
Я действительно застрял над этой вещью, я привожу здесь код.
Проблема в том, что mousePressEvent отлично работает только вне graphicsView, всегда печатая «1. X: … Y: …».
Я также создал новый класс для graphicsView, как показано ниже:

//myGraphicsView.h
class MyGraphicsView : public QWidget
{
Q_OBJECT
public:
explicit MyGraphicsView(QWidget *parent = 0);

protected:
void mousePressEvent(QMouseEvent* ev);
bool eventFilter(QObject *obj, QEvent *e);

private:
QGraphicsView *gv;
QVBoxLayout *layout;
};

myGraphicView.cpp выглядит следующим образом:

MyGraphicsView::MyGraphicsView(QWidget *parent) :
QWidget(parent)
{
gv = new QGraphicsView;
layout = new QVBoxLayout;
layout->addWidget(gv);
setLayout(layout);

gv->setMouseTracking(true);
setMouseTracking(true);
}

void MyGraphicsView::mousePressEvent(QMouseEvent* event)
{
qDebug() << "1. X: " << event->pos().x() << "; Y: " << event->pos().y() << endl;
}

bool MyGraphicsView::eventFilter(QObject *obj, QEvent *e)
{
if (e->type() == QEvent::MouseButtonPress)
{
QMouseEvent *mouseEvent = (QMouseEvent *) e;
qDebug() << "3. X: " << mouseEvent->x() << "; Y: " << mouseEvent->y() << endl;
return true;
}
return false;
}

MainWindows.h выглядит следующим образом:

    namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

protected:
void mousePressEvent(QMouseEvent* ev);

private:
Ui::MainWindow *ui;
MyGraphicsView *v;
};

MainWindows.cpp выглядит следующим образом:

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

v = new MyGraphicsView;
setMouseTracking(true);
setCentralWidget(v);

setWindowTitle("Simple mouse tracker");
resize(300, 300);
}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::mousePressEvent(QMouseEvent* ev)
{
qDebug() << "2. X: " << ev->pos().x() << "; Y: " << ev->pos().y() << endl;
}

0

Решение

Я бы порекомендовал следующий способ:

Создайте свой собственный класс с использованием QGraphicsView

#ifndef MYGRAPHICVIEW_H
#define MYGRAPHICVIEW_H

#include <QGraphicsView>

class MyGraphicView : public QGraphicsView
{
public:
MyGraphicView(QWidget *parent);

protected:
virtual void mouseMoveEvent(QMouseEvent *e);
};

#endif // MYGRAPHICVIEW_Hcode here
#include "mygraphicview.h"#include <QMouseEvent>
#include <QDebug>

MyGraphicView::MyGraphicView(QWidget *parent) : QGraphicsView(parent)
{
setMouseTracking(true);
}

void MyGraphicView::mouseMoveEvent(QMouseEvent *e)
{
qDebug() << e->pos().x() << e->pos().y();
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
MyGraphicView *v = new MyGraphicView(this);
}

MainWindow::~MainWindow()
{
delete ui;
}
0

Другие решения


По вопросам рекламы [email protected]