QML-在 MouseArea 中未检测到右键单击

Posted

技术标签:

【中文标题】QML-在 MouseArea 中未检测到右键单击【英文标题】:QML- Right Click Not Detected in MouseArea 【发布时间】:2014-03-16 22:01:09 【问题描述】:

我正在开发图像编辑器,特别是使用 MouseArea(在 Button 类型内)设置当前左键或右键的关联颜色。我遇到的问题是我似乎根本无法过滤特定按钮。这是给我带来麻烦的sn-p:

    Button 
        x: 60
        width: 80
        height: 40
        text: "Blue"

        anchors.verticalCenter: parent.verticalCenter

        onButtonClick: 
            if(mouseArea.pressedButtons & Qt.RightButton) 
                console.log("Right button used");
                GlobalState.setRightColorValues(0.0, 0.0, 1.0, 1.0);
             else 
                console.log("Left button used");
                GlobalState.setLeftColorValues(0.0, 0.0, 1.0, 1.0);
            
        
    

(如果需要,我可以提供完整的 Button.qml,但主要来自 here)。

我正在尝试遵循示例here,但用于过滤鼠标右键单击的方法似乎不起作用(无论如何)。发生的情况是“默认”假设左键单击的语句。我也尝试将两者分离为不同的 if 语句,但这样做会导致 no 按钮被显式过滤。

为了过滤特定的鼠标按钮需要进行哪些更改?还是我必须实现 Paint/Paint.NET 中使用的那种“切换原色”按钮?

编辑 1:我意识到 Button.qml 中缺少相关的 sn-p-

 MouseArea
    id: buttonMouseArea;

    acceptedButtons: Qt.AllButtons;
    hoverEnabled: true

    onEntered: parent.color = onHoverColor
    onExited:  parent.color = buttonColor

    anchors.fill: parent;

    onClicked: buttonClick();

这嵌套在一个Rectangle 中,它还包含一个Text 字段。

【问题讨论】:

【参考方案1】:

默认情况下,MouseArea 只处理鼠标左键。您可以通过设置acceptedButtons 属性来处理其他按钮。您可以使用 onClicked 处理程序中可访问的mouse MouseEvent 来确定是哪个按钮导致了点击。

MouseArea 
    acceptedButtons: Qt.LeftButton | Qt.RightButton

    onClicked: 
        if (mouse.button === Qt.RightButton)  // 'mouse' is a MouseEvent argument passed into the onClicked signal handler
            console.log("right button clicked!")
         else if (mouse.button === Qt.LeftButton) 
            console.log("left button clicked!")
        
    

见acceptedButtons和mouseMouseEvent

【讨论】:

实际上,我已经启用了 Button.qml 中的所有按钮——我可能应该发布那个 sn-p。我将编辑我的主要帖子以强调这一点。【参考方案2】:

您可以这样检查按钮:

MouseArea 
   acceptedButtons: Qt.LeftButton | Qt.RightButton
   onClicked: 
        if(mouse.button & Qt.RightButton) 
        
    

【讨论】:

【参考方案3】:

我观察到pressedButtons 仅适用于onPressed,不适用于onClicked。 我觉得这很奇怪,因为clicked() 只不过是a press followed by a release。因此,我认为它也适用于 clicked(),但遗憾的是它没有。

例子:

MouseArea 
    id: idMouseArea

    acceptedButtons: Qt.LeftButton | Qt.RightButton

    anchors.fill: parent

    //onClicked:    // pressedButtons not identified with onClicked
    onPressed:      // pressedButtons identified and works well with onPressed
        if (idMouseArea.pressedButtons & Qt.RightButton) 
            console.log("right-button pressed")
         else if (idMouseArea.pressedButtons & Qt.LeftButton) 
            console.log("left-button pressed")
        
    

这是我在 Qt 5.5.1 和 QtQuick 2.5 中观察到的。 documentation 没有显示如何将 pressedButtons 属性与 if-else 一起使用。如果观察错误,请更正/评论。


更新: 如果您迫切需要将pressedButtonsonClicked 一起使用,您可以使用以下技巧。

    MouseArea 
        property int mouseButtonClicked: Qt.NoButton

        acceptedButtons: Qt.RightButton | Qt.LeftButton

        anchors.fill: parent

        onPressed: 
            if (pressedButtons & Qt.LeftButton) 
                mouseButtonClicked = Qt.LeftButton
             else if (pressedButtons & Qt.RightButton) 
                mouseButtonClicked = Qt.RightButton
            
        

        onClicked: 
            if (mouseButtonClicked === Qt.LeftButton) 
                console.log("left button clicked")
             else if (mouseButtonClicked === Qt.RightButton) 
                console.log("right button clicked")
            
        
    

【讨论】:

不确定当时是否有所不同,但onClicked 接收到一个参数mouse,它的属性button 包含单击了哪个按钮。见here pressedButtons 包含当前按下的按钮。 pressedButtons 不适用于 onClicked 的原因是因为 onClicked 仅在释放鼠标按钮后发生,这意味着当前没有按下任何按钮。 @StefanF*** 是正确的,应该使用 mouse 事件。【参考方案4】:

如果您为您感兴趣的每个鼠标按钮指定一个MouseArea,则可以避免使用if 语句:

MouseArea 
    anchors.fill: parent
    onClicked: console.log("do left click action")


MouseArea 
    anchors.fill: parent
    acceptedButtons: Qt.RightButton
    onClicked: console.log("do right click action")

【讨论】:

以上是关于QML-在 MouseArea 中未检测到右键单击的主要内容,如果未能解决你的问题,请参考以下文章

QML中MouseArea元素的介绍

是否可以检测到右键单击浏览器上下文菜单上的左键单击?

QML 未能检测到在 C++ 中破坏的 QObject

QML Popup:知道它是如何关闭的

QML:从动态 MouseArea 中“窃取”事件

QML:在 C++ 中获取 MouseArea 的鼠标事件