未按住鼠标按钮时未接收到 mouseMoveEvent

问题描述 投票:0回答:2

我正在尝试实现悬停功能,当我将鼠标悬停在项目上的特定区域时,我会重新绘制该项目。

class TestItem : public QQuickItem
{
    Q_OBJECT

public:
    explicit TestItem(QQuickItem *parent = nullptr) : QQuickItem(parent)
    {
        setAcceptHoverEvents(true);
        setAcceptedMouseButtons(Qt::AllButtons);
    }

protected:
    // QQuickItem interface
    void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE
    {
        qDebug() << "mouseMoveEvent()" << event->buttons() << event->x() << event->y();
    }

    void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE
    {
        qDebug() << "mousePressEvent()" << event->buttons() << event->x() << event->y();
    }

    void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE
    {
        qDebug() << "mouseReleaseEvent()" << event->buttons() << event->x() << event->y();
    }
};

但是,使用此类,当我将光标移到项目上时,我在终端上没有收到任何“mouseMoveEvent()”输出。仅当按住任何鼠标按钮时才有效。

如何在不强迫用户按住任何鼠标按钮的情况下实现此目的?

c++ qml qt5 qtquick2
2个回答
3
投票

可以自己解决,问题是我监听了错误的事件。正确的事件应该是

hoverMoveEvent()

使用以下类,我得到了正确的输出:

class TestItem : public QQuickItem
{
    Q_OBJECT

public:
    explicit TestItem(QQuickItem *parent = nullptr) : QQuickItem(parent)
    {
        setAcceptHoverEvents(true);
    }

protected:
    // QQuickItem interface
    void hoverEnterEvent(QHoverEvent *event) Q_DECL_OVERRIDE
    {
        qDebug() << "hoverEnterEvent()" << event->posF();
    }

    void hoverMoveEvent(QHoverEvent *event) Q_DECL_OVERRIDE
    {
        qDebug() << "hoverMoveEvent()" << event->posF();
    }

    void hoverLeaveEvent(QHoverEvent *event) Q_DECL_OVERRIDE
    {
        qDebug() << "hoverLeaveEvent()" << event->posF();
    }
};

0
投票

默认情况下,只有按住鼠标按钮时才会触发鼠标事件。

https://doc.qt.io/qt-5/qwidget.html#mouseTracking-prop

像这样使用:

    explicit TestItem(QQuickItem *parent = nullptr) : QQuickItem(parent)
    {
        setMouseTracking(true); /* <-- */
        setAcceptHoverEvents(true);
        setAcceptedMouseButtons(Qt::AllButtons);
    } 

或者,您可以实现悬停事件

© www.soinside.com 2019 - 2024. All rights reserved.