Qt 鼠标事件在 QGraphicsScene 中不起作用

Qt mouse events not working in QGraphicsScene

我正在使用 Qt 5.7(最新版本)。我无法让鼠标事件在 QGraphicsScene 中工作,但它们在我场景之外的 window 中工作。我已经关注了这个 question.

所以我在主小部件的子类中覆盖了 QWidget::mouseMoveEvent(),如下所示:

// header:
class MyWidget {
    ...
    void mouseMoveEvent( QMouseEvent * event );
};

// source:
MyWidget::MyWidget() {
    setMouseTracking();
}

void MyWidget::mouseMoveEvent( QMouseEvent * event ) {

}

不适用于:mouseMoveEventmouseGrabbermousePressEventmouseReleaseEventmouseDoubleClickEvent。但不知何故它只适用于 mousePressEvent.

这可能是 Qt 中的错误吗?

源代码: 在objectloader.cpp

ObjectLoader::ObjectLoader(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::ObjectLoader)
{
  ui->setupUi(this);
   scene=new QGraphicsScene(this);
   ui->graphicsView->setScene(scene);
   ui->graphicsView->setMouseTracking(true);
  setMouseTracking(true);



}

那是我设置了两次鼠标跟踪 在 objectloader.h 然后我在 objectloader.h

中定义该方法
class ObjectLoader : public QMainWindow
{
    Q_OBJECT


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

    private slots:
    void mouseMoveEvent(QMouseEvent *event);
    protected:

    private:

    };

    #endif // OBJECTLOADER_H

并在 objectloader.cpp

中实施该方法
void ObjectLoader::mouseMoveEvent(QMouseEvent *event){

    qDebug()<<"Mouse moved";

}

Mouse move events will occur only when a mouse button is pressed down, unless mouse tracking has been enabled with QWidget::setMouseTracking().

因此,我认为您应该使用“bool hasMouseTracking() const”检查 mouseTracking 是否 真的 已启用。

当 Qt 生成鼠标事件时,它通常首先传递给生成事件时鼠标指针下方的 QWidget。如果 QWidget accepts 事件,则不会进行进一步处理。如果事件 未被 接受,则 Qt 可能会将事件传播给 QWidget 的父级,依此类推。

在您的特定情况下,您感兴趣的鼠标移动事件将被发送到接受它们的 QGraphicsView/QGraphicsScene 组件,因此不会进行进一步处理。在这种情况下,您通常需要安装一个 event filter 来拦截和处理感兴趣的事件。