MouseArea 窃取 QQuickItem 的鼠标事件

Posted

技术标签:

【中文标题】MouseArea 窃取 QQuickItem 的鼠标事件【英文标题】:MouseArea steals QQuickItem's mouse events 【发布时间】:2018-04-07 11:51:19 【问题描述】:

有一个QQuickPaintedItem 带有重载的鼠标事件处理程序:

void Plotter::mousePressEvent(QMouseEvent *event)

    qDebug() << "mousePressEvent";


void Plotter::mouseMoveEvent(QMouseEvent* event)

    qDebug() << "mouseMoveEvent";


void Plotter::hoverMoveEvent(QHoverEvent *event)

    qDebug() << "hoverMoveEvent";

我想在 QML 代码中为这个 QQuickPaintedItem 添加一个上下文菜单,所以我必须将 MouseArea 添加到这个元素中:

Plotter 
    id: plotter
    // ...

    Menu 
        id: contextMenu
        MenuItem  text: "Добавить маркер" 
        MenuItem  text: "Удалить маркер" 
        MenuItem  text: "Удалить все маркеры" 
        MenuItem  text: "Установить шаг" 
           

    MouseArea 
        anchors.fill: parent
        acceptedButtons: Qt.RightButton
        propagateComposedEvents: true

        onClicked: 
            if (!mouseScaleButton.checked) 
                contextMenu.popup();
            
            else
                mouse.accepted = false;

        

    

但如果我按下右键,它不会捕捉到 QQuickPaintedItem 的 mousePressEvent

你能解释一下为什么会这样吗?

【问题讨论】:

【参考方案1】:

MouseArea 只能是 enabled: !mouseScaleButton.checked

另外,鼠标区域不应该在菜单下方吗?这样它会同时阻止绘图仪和菜单。

另外,仅仅因为您设置了acceptedButtons: Qt.RightButton 并不一定意味着它会通过左键单击(我还没有测试过)。您可能必须启用这两个按钮并设置mouse.accepted = false 以防左键单击,以便向下传播。

【讨论】:

以上是关于MouseArea 窃取 QQuickItem 的鼠标事件的主要内容,如果未能解决你的问题,请参考以下文章

Qml 错误:无法将 QObject* 分配给 QQuickItem

将背景图像添加到 QQuickItem

QQuickItem::mapToItem 返回类型是啥?

如何创建 QQuickItem 的单独副本并将其呈现在不同的窗口上

在 QQuickItem 中绘制不同颜色的多个点

C++ QQuickItem:如何在项目大小更改时触发函数