在继承自 QGraphicsView 的 class 中使用 QGraphicsSceneMouseEvent

Use a QGraphicsSceneMouseEvent in a class that inherits from QGraphicsView

我有一个继承自 QGraphicsView 的 class。我使用 QGraphicsScene 在 window.

中显示图像

这里可以正常使用。 但是,我想使用 QGraphicsSceneMouseEvent 鼠标事件在此图像上绘制。问题是,如果我使用 QGraphicsSceneMouseEvent,我不适合 mousePressEvent 和 mouseMoveEvent 方法。

我尝试使用 QMouseEvent * 事件,但我无法访问 lastScenePos () 例如。

这是我显示图像的代码

DisplayImage.h :

class DisplayImage : public QGraphicsView{

Q_OBJECT

public:
DisplayImage(QWidget *parent=0);
void displayImg(const QImage &image);

private:
QGraphicsScene *scene;
QPixmap pixmap;
QGraphicsPixmapItem *pixmapItem;

protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event);
void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
};

DisplayImage.cpp:

DisplayImage::DisplayImage(QWidget* parent) : QGraphicsView(parent){
scene = new QGraphicsScene(this);
pixmapItem=new QGraphicsPixmapItem(pixmap);
scene->addItem(pixmapItem);
this->setScene(scene);
}
void DisplayImage::displayImg(const QImage &image){
pixmap=QPixmap::fromImage(image);
pixmapItem->setPixmap(pixmap);
this->setSceneRect(0,0,image.width(),image.height());
this->fitInView(pixmapItem, Qt::KeepAspectRatio);
this->centerOn(pixmapItem);
}

这里我想将 mousePressEvent 和 mouseMoveEvent 方法与 QGraphicsSceneMouseEvent 一起使用。 任何人都可以解决这个问题吗?

覆盖方法时,不能更改参数指示的数据类型。解决方案是为场景使用事件过滤器:

*.h

#ifndef DISPLAYIMAGE_H
#define DISPLAYIMAGE_H

#include <QGraphicsView>

class DisplayImage : public QGraphicsView
{
    Q_OBJECT
public:
    DisplayImage(QWidget *parent=0);
    void displayImg(const QImage &image);

    bool eventFilter(QObject *watched, QEvent *event);
private:
    QGraphicsScene *scene;
    QPixmap pixmap;
    QGraphicsPixmapItem *pixmapItem;
};
#endif // DISPLAYIMAGE_H

*.cpp

#include "displayimage.h"

#include <QEvent>
#include <QGraphicsPixmapItem>
#include <QGraphicsSceneMouseEvent>

#include <QDebug>

DisplayImage::DisplayImage(QWidget *parent):QGraphicsView(parent)
{
    scene = new QGraphicsScene(this);
    pixmapItem=new QGraphicsPixmapItem(pixmap);
    scene->addItem(pixmapItem);
    setScene(scene);
    scene->installEventFilter(this);
}

void DisplayImage::displayImg(const QImage &image){
    pixmap=QPixmap::fromImage(image);
    pixmapItem->setPixmap(pixmap);
    setSceneRect(image.rect());
    fitInView(pixmapItem, Qt::KeepAspectRatio);
    centerOn(pixmapItem);
}

bool DisplayImage::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == scene){
        // press event
        QGraphicsSceneMouseEvent *mouseSceneEvent;
        if(event->type() == QEvent::GraphicsSceneMousePress){
            mouseSceneEvent = static_cast<QGraphicsSceneMouseEvent *>(event);
            qDebug()<<mouseSceneEvent->scenePos()<<mouseSceneEvent->lastScenePos();
           // your logic here
        }
        // move event
        else if (event->type() == QEvent::GraphicsSceneMouseMove) {
            mouseSceneEvent = static_cast<QGraphicsSceneMouseEvent *>(event);
            qDebug()<<mouseSceneEvent->scenePos()<<mouseSceneEvent->lastScenePos();
            // your logic here
        }
        // release event
        else if (event->type() == QEvent::GraphicsSceneMouseRelease) {
            mouseSceneEvent = static_cast<QGraphicsSceneMouseEvent *>(event);
            qDebug()<<mouseSceneEvent->scenePos()<<mouseSceneEvent->lastScenePos();
            // your logic here
        }
    }
    return QGraphicsView::eventFilter(watched, event);
}

完整的例子可以在下面下载link