【问题标题】:Use a QGraphicsSceneMouseEvent in a class that inherits from QGraphicsView在继承自 QGraphicsView 的类中使用 QGraphicsSceneMouseEvent
【发布时间】:2018-07-03 10:05:02
【问题描述】:

我有一个继承自 QGraphicsView 的类。我使用 QGraphicsScene 在窗口中显示图像。

在这里它可以正常工作。 但是,我想使用 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 一起使用。 有没有人可以解决这个问题?

【问题讨论】:

    标签: c++ qt qt5 qgraphicsview qgraphicsscene


    【解决方案1】:

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

    *.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下载

    【讨论】:

    • 感谢您的回答,因为缺点我不知道如何使用 mousePressEvent 和 mouseMoveEvent 方法?我把我想要的代码直接放在事件过滤器中?还是我重写这两种方法?因为当我只是做eventfilter时,我没有看到调试出现......
    • @Tom13000 你把下面的return QGraphicsView::eventFilter(watched, event); 放了吗?您是否对我的解决方案进行了修改?
    • @Tom13000 你必须使用void mouseXXXEvent(QMouseEvent *event)
    • 我完全使用了您的解决方案来使用 return 进行 evenfilter。然后我在我的代码中使用了 mousePressEvent (QMouseEvent * event) 和 mouseMoveEvent (QMouseEvent * event),但是如果我在这些方法中进行调试,则不会出现任何内容。
    • @Tom13000 如果有人给你一个例子,那是给你测试它,当你看到它工作并且你理解它是如何工作的时候,你应该尝试在你自己的代码中实现它,您必须订购。
    猜你喜欢
    • 2023-03-27
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多