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和mouse
MouseEvent
【讨论】:
实际上,我已经启用了 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 一起使用。如果观察错误,请更正/评论。
更新:
如果您迫切需要将pressedButtons
与onClicked
一起使用,您可以使用以下技巧。
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 中未检测到右键单击的主要内容,如果未能解决你的问题,请参考以下文章