在Qt5的QQuickItem上捕获鼠标移动事件

3
我正在跟进我的 上一个问题 的回复。但是我遇到了困难 U_U。
我正在开发一个Qt5应用程序,当鼠标悬停在QQuickItem项目上时,我想捕获mouseMoveEvent事件。但我不知道如何让它工作。
我已经通过使用这个代码来隔离有问题的代码: main.cpp:
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QtQuick>

class MyItem : public QQuickItem
{
public:
    MyItem()
    {
        setAcceptHoverEvents(true);
        setAcceptedMouseButtons(Qt::AllButtons);
        setFlag(ItemAcceptsInputMethod, true);
    }

    void mousePressEvent(QMouseEvent* event)
    {
        QQuickItem::mousePressEvent(event);
        qDebug() << event->pos();
    }

    void mouseMoveEvent(QMouseEvent* event)
    {
        QQuickItem::mouseMoveEvent(event);
        qDebug() << event->pos();
    }
};

int main(int argc, char** argv)
{
    QGuiApplication app(argc, argv);

    QQuickView* view = new QQuickView;
    qmlRegisterType<MyItem>("Test", 1, 0, "MyItem");
    view->setSource(QUrl(QStringLiteral("qrc:/main.qml")));
    view->show();

    return app.exec();
}

main.qml:

import QtQuick 2.4
import QtQuick.Controls 1.3

import Test 1.0

Rectangle {
    width: 400
    height: 400
    visible: true

    MyItem {
        anchors.fill: parent
    }

    Button {
        x: 100
        y: 100
        text: "Button"
    }
}

在这个示例代码中,mousePressEvent 被捕获了,但是 mouseMoveEvent 没有被捕获。为什么?我认为解决方案一定很简单,但是我找不到我的错误。

3
也许你想要重写hoverEnterEvent()和/或 hoverMoveEvent()和/或 hoverLeaveEvent()? - Jeremy Friesner
你说得很对。明天会是非常高效的一天。非常感谢你。 - marc.poch
1个回答

7
感谢 Jeremy Friesner 的评论,我得到了可工作的代码:
main.cpp:
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QtQuick>

class MyItem : public QQuickItem
{
public:
    MyItem()
    {
        setAcceptHoverEvents(true);
        setAcceptedMouseButtons(Qt::AllButtons);
        setFlag(ItemAcceptsInputMethod, true);
    }

    void mousePressEvent(QMouseEvent* event)
    {
        QQuickItem::mousePressEvent(event);
        qDebug() << event->pos();
    }

    //This is function to override:
    void hoverMoveEvent(QHoverEvent* event) {
        QQuickItem::hoverMoveEvent(event);
        qDebug() << event->pos();
    }
};

int main(int argc, char** argv)
{
    QGuiApplication app(argc, argv);

    QQuickView* view = new QQuickView;
    qmlRegisterType<MyItem>("Test", 1, 0, "MyItem");
    view->setSource(QUrl(QStringLiteral("qrc:/main.qml")));
    view->show();

    return app.exec();
}

main.qml:

import QtQuick 2.4
import QtQuick.Controls 1.3

import Test 1.0

Rectangle {
    width: 400
    height: 400
    visible: true

    MyItem {
        anchors.fill: parent
    }

    Button {
        x: 100
        y: 100
        text: "Button"
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接